Я столкнулся с той же проблемой, я немного подумал об этом, и вот как я обошел ее.
Во-первых, зачем мне это нужно? Я хотел внедрить некоторые зависимости в мою иерархию контроллера представления, прежде чем он будет построен из раскадровки. Я предполагаю, что это то, для чего предназначен API. Но тогда, будет ли этот метод работать, как бы я передавал информацию о внедрении в иерархию контроллера представления?
Итак, поскольку метод работает без ошибок для контроллеров представления, я решил внедрить информацию непосредственно в root view controller.
Итак, у меня в раскадровке:
- Сцена контроллера окна с именем "my-window-controller", окно которой просто указывает на пустой вид controller.
- Сцена контроллера представления с именем "root -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)
}
}