Невозможно использовать настраиваемый оконный контроллер раскадровки - PullRequest
1 голос
/ 21 февраля 2020

Я получаю то, что похоже на ошибку при попытке пользовательского создания экземпляра контроллера окна из раскадровки. Я использую NSStoryboard.instantiateController (идентификатор: creator:), который является новой функцией MacOS 10.15. Блок кода, о котором идет речь:

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

Я использовал SUCCESSFULLY в основном этот точный код для пользовательского создания экземпляра основного контроллера view и назначения этого представления новому окну и новый оконный контроллер. Это отлично работает. Я также могу создать экземпляр контроллера window по старинке без пользовательской инициализации с помощью instantiateController (идентификатор :). Но когда я пытаюсь использовать приведенный выше код для пользовательского создания экземпляра контроллера window , я получаю следующую ошибку:

Ошибка подтверждения в - [NSClassSwapper _createControllerForCreator : coder:] ... Пользовательский экземплярный экземпляр контроллера должен вызывать - [super initWithCoder:]

Обратите внимание, что и мой класс контроллера пользовательских представлений (который работает), и мой класс пользовательских контроллеров окон MainWindowController (который не ' t) реализовали тривиальный инициализатор:

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

Я знаю, что эта функциональность является новой с OS 10.15, но в документации сказано, что она должна работать для контроллеров окон И контроллеров представления, и сообщение об ошибке не имеет никакого смысла для меня.

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Я столкнулся с той же проблемой, я немного подумал об этом, и вот как я обошел ее.

Во-первых, зачем мне это нужно? Я хотел внедрить некоторые зависимости в мою иерархию контроллера представления, прежде чем он будет построен из раскадровки. Я предполагаю, что это то, для чего предназначен 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)
    }
}
0 голосов
/ 14 марта 2020

Это подано как Feedback # FB7626059, если вы хотите набрать кучу (я тоже затронул проблему).

...