ストーリーボードからウィンドウコントローラーをカスタムインスタンス化しようとすると、バグのように感じられます。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の時点で新しいことは知っていますが、ドキュメントにはウィンドウコントローラーとビューコントローラーで機能するはずであると記載されており、エラーメッセージは私には意味がありません。
私は同じ問題にぶつかりました、私はそれについて少し考えました、そしてこれが私がそれを回避した方法です。
まず、なぜこれが必要なのですか?ストーリーボードから構築する前に、ViewController階層にいくつかの依存関係を注入したかったのです。それがAPIの目的だと思います。しかし、そのメソッドは機能しますか?インジェクション情報をビューコントローラー階層に渡すにはどうすればよいですか?
そのため、このメソッドはView Controllerでバグなしで機能しているため、ルートViewControllerに直接情報を挿入することにしました。
だから、私は私のストーリーボードにあります:
そして、その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]
コメントを追加