ストーリーボードのカスタムインスタンス化されたウィンドウコントローラーを使用できません

タイラーアンダーソン

ストーリーボードからウィンドウコントローラーをカスタムインスタンス化しようとすると、バグのように感じられます。MacOS 10.15以降の新機能であるNSStoryboard.instantiateController(identifier:creator :)を使用しています。問題のコードのブロックは次のとおりです。

Let mainWindowController = storyboard.instantiateController(identifier: "Analysis Window Controller") { aDecoder in  
            MainWindowController(coder: aDecoder)  
        } 

私は基本的にこの正確なコードを使用して、メインビューコントローラーをカスタムインスタンス化し、そのビューを新しいウィンドウと新しいウィンドウコントローラーに割り当てることに成功しました。それはうまくいきます。また、instantiateController(identifier :)を使用してカスタム初期化せずに、昔ながらの方法でウィンドウコントローラーをインスタンス化することもできますしかしウィンドウコントローラーのカスタムインスタンス化のために上記のコードを試してみると、次のエラーが発生します。

-[NSClassSwapper _createControllerForCreator:coder:]でのアサーションの失敗...カスタムインスタンス化されたコントローラーは-[super initWithCoder:]を呼び出す必要があります

カスタムビューコントローラークラス(機能する)とカスタムウィンドウコントローラークラスMainWindowController(機能しない)の両方に、簡単な初期化子が実装されていることに注意してください。

  required init?(coder: NSCoder) {  
        super.init(coder: coder)  
    }  

この機能はOS10.15の時点で新しいことは知っていますが、ドキュメントにはウィンドウコントローラーとビューコントローラーで機能するはずであると記載されており、エラーメッセージは私には意味がありません。

AirXygen

私は同じ問題にぶつかりました、私はそれについて少し考えました、そしてこれが私がそれを回避した方法です。

まず、なぜこれが必要なのですか?ストーリーボードから構築する前に、ViewController階層にいくつかの依存関係を注入したかったのです。それがAPIの目的だと思います。しかし、そのメソッドは機能しますか?インジェクション情報をビューコントローラー階層に渡すにはどうすればよいですか?

そのため、このメソッドはView Controllerでバグなしで機能しているため、ルートViewControllerに直接情報を挿入することにしました。

だから、私は私のストーリーボードにあります:

  • 「my-window-controller」という名前のウィンドウコントローラーシーン。このウィンドウは、空のビューコントローラーを指しているだけです。
  • 「root-view-controller」という名前のビューコントローラーシーン。すべてのビュー階層が記述されています。

そして、そのView Controllerを作成したい場合は、次のようにします。

func instanciateWindowController(storyboard: NSStoryboard) -> NSWindowController {

    //  Load the (empty) window controller scene
    let wcSceneIdentifier   = NSStoryboard.SceneIdentifier("my-window-controller")
    let windowController    = storyboard.instantiateController(withIdentifier: wcSceneIdentifier)
            as! NSWindowController

    //  Load the root view controller using the creator trick to inject dependencies
    let vcSceneIdentifier   = NSStoryboard.SceneIdentifier("root-view-controller")
    let viewController      = storyboard.instantiateController(identifier: vcSceneIdentifier,
                                                               creator: { coder in
        return MyOwnViewController.init(coder: coder,
                                        text:   "Victoire !") // just pass here your injection info
    })

    //  Associate the window controller and the root view controller
    windowController.contentViewController  = viewController

    return windowController
}

class MyOwnViewController: MSViewController {
    init?(coder:   NSCoder,
          text:    String) { // receive here the injection information
        print(text) // use the injection information here
        super.init(coder: coder)
    }

    // Not used, but required
    required init?(coder:   NSCoder) {
        super.init(coder: coder)
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

GoogleクラウドのSlurmクラスター:コントローラー/ログインノードのマウントされたディレクトリのデータは、計算ノードでは使用できません

分類Dev

OSがインストールされたフォントは、ストーリーボードのドロップダウンでは使用できません

分類Dev

ストーリーボードによって作成されたウィンドウのタイトルをプログラムで変更する

分類Dev

jqueryオートコンプリートカスタムデータエラーオートコンプリートウィジェットインスタンスのそのようなメソッド「インスタンス」はありません

分類Dev

キーボードにバインドされたTkinterボタンはクラスパラメータをカウントしません

分類Dev

ウィンドウのサイズが変更されても、カスタムコントロールのサイズは変更されません

分類Dev

FXMLで宣言されたカスタムコントロールは、初期化時に宣言されたフィールドにアクセスできません

分類Dev

ローカルのスプリングクラウドデータフローサーバーでシェルをポイントできませんか?

分類Dev

ポイントカウンタースクリプトにコードを追加できません

分類Dev

EXTJSのモーダルウィンドウでボタンがクリックされたときに、メインウィンドウでストアをリロード/グリッドを更新します

分類Dev

カスタムmavenネクサスリポジトリからダウンロードされたjarからクラスをインポートできません

分類Dev

データベースにバインドされたドロップダウンリストから値を取得できません

分類Dev

カスタマイズされたナビゲーションドロワーのボタンのテキストを設定できません

分類Dev

GoogleクラウドプラットフォームでホストされているdatastaxCassandraクラスターのcqlshにログインできません

分類Dev

Rでコード化されたカスタムモードバーボタンを介してプロットグラフからデータをダウンロードします

分類Dev

サブリスト内の特定のティッカーについてのみ、パッケージyfinanceを使用してフォーマットごとにグループでダウンロードされたデータをパンダデータフレームに取得できません

分類Dev

サブリスト内の特定のティッカーについてのみ、パッケージyfinanceを使用してフォーマットごとにグループでダウンロードされたデータをパンダデータフレームに取得できません

分類Dev

クラスコンストラクターで初期化されたタイプのストリームのメンバー変数を使用できますか?

分類Dev

ドロップダウンリストのExcelからデータをインポートできません

分類Dev

コンポーネントhttpでAngular1.4の新しいルーターを使用すると、「コントローラーHeadlinesControllerをインスタンス化できませんでした」という警告がスローされます。

分類Dev

スライダーボタンでセグメント化されたコントロールウィジェットを作成する-フラッター

分類Dev

マウントされた暗号化ボリュームのパスワードを表示できますか?

分類Dev

マウントされた暗号化ボリュームのパスワードを表示できますか?

分類Dev

ダイアログウィンドウでSOFT_INPUT_ADJUST_RESIZEを使用していても、キーボードが表示されているときにカスタムビューのDialogFragmentのサイズが変更されません

分類Dev

カスタム クラス ドロップダウン Xcode 8.3.2 でカスタム コントローラー クラスが見つかりません

分類Dev

最大化されたウィンドウのウィンドウコントロールにアクセスできません

分類Dev

最大化されたウィンドウのウィンドウコントロールにアクセスできません

分類Dev

タスクランナーエクスプローラーウィンドウがGulpfile.jsの下に「ロードに失敗」し、ビルドプロセスがリストされていませんでした

分類Dev

xmlデータをc#のドロップダウンリストにバインドできません

Related 関連記事

  1. 1

    GoogleクラウドのSlurmクラスター:コントローラー/ログインノードのマウントされたディレクトリのデータは、計算ノードでは使用できません

  2. 2

    OSがインストールされたフォントは、ストーリーボードのドロップダウンでは使用できません

  3. 3

    ストーリーボードによって作成されたウィンドウのタイトルをプログラムで変更する

  4. 4

    jqueryオートコンプリートカスタムデータエラーオートコンプリートウィジェットインスタンスのそのようなメソッド「インスタンス」はありません

  5. 5

    キーボードにバインドされたTkinterボタンはクラスパラメータをカウントしません

  6. 6

    ウィンドウのサイズが変更されても、カスタムコントロールのサイズは変更されません

  7. 7

    FXMLで宣言されたカスタムコントロールは、初期化時に宣言されたフィールドにアクセスできません

  8. 8

    ローカルのスプリングクラウドデータフローサーバーでシェルをポイントできませんか?

  9. 9

    ポイントカウンタースクリプトにコードを追加できません

  10. 10

    EXTJSのモーダルウィンドウでボタンがクリックされたときに、メインウィンドウでストアをリロード/グリッドを更新します

  11. 11

    カスタムmavenネクサスリポジトリからダウンロードされたjarからクラスをインポートできません

  12. 12

    データベースにバインドされたドロップダウンリストから値を取得できません

  13. 13

    カスタマイズされたナビゲーションドロワーのボタンのテキストを設定できません

  14. 14

    GoogleクラウドプラットフォームでホストされているdatastaxCassandraクラスターのcqlshにログインできません

  15. 15

    Rでコード化されたカスタムモードバーボタンを介してプロットグラフからデータをダウンロードします

  16. 16

    サブリスト内の特定のティッカーについてのみ、パッケージyfinanceを使用してフォーマットごとにグループでダウンロードされたデータをパンダデータフレームに取得できません

  17. 17

    サブリスト内の特定のティッカーについてのみ、パッケージyfinanceを使用してフォーマットごとにグループでダウンロードされたデータをパンダデータフレームに取得できません

  18. 18

    クラスコンストラクターで初期化されたタイプのストリームのメンバー変数を使用できますか?

  19. 19

    ドロップダウンリストのExcelからデータをインポートできません

  20. 20

    コンポーネントhttpでAngular1.4の新しいルーターを使用すると、「コントローラーHeadlinesControllerをインスタンス化できませんでした」という警告がスローされます。

  21. 21

    スライダーボタンでセグメント化されたコントロールウィジェットを作成する-フラッター

  22. 22

    マウントされた暗号化ボリュームのパスワードを表示できますか?

  23. 23

    マウントされた暗号化ボリュームのパスワードを表示できますか?

  24. 24

    ダイアログウィンドウでSOFT_INPUT_ADJUST_RESIZEを使用していても、キーボードが表示されているときにカスタムビューのDialogFragmentのサイズが変更されません

  25. 25

    カスタム クラス ドロップダウン Xcode 8.3.2 でカスタム コントローラー クラスが見つかりません

  26. 26

    最大化されたウィンドウのウィンドウコントロールにアクセスできません

  27. 27

    最大化されたウィンドウのウィンドウコントロールにアクセスできません

  28. 28

    タスクランナーエクスプローラーウィンドウがGulpfile.jsの下に「ロードに失敗」し、ビルドプロセスがリストされていませんでした

  29. 29

    xmlデータをc#のドロップダウンリストにバインドできません

ホットタグ

アーカイブ