无法使用情节提要自定义实例化窗口控制器

泰勒·安德森

尝试从情节提要中自定义实例化窗口控制器时,我得到的感觉像是个错误。我正在使用NSStoryboard.instantiateController(identifier:creator:),这是MacOS 10.15中的新功能。有问题的代码块是:

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)  
    }  

我知道此功能自OS 10.15起是新功能,但文档说它应适用于窗口控制器和视图控制器,并且该错误消息对我没有任何意义。

空气氧气

我遇到了同样的问题,我想了一下,这就是我的解决方法。

首先,为什么我需要这样做?我想在从Storyboard构建视图控制器层次结构之前为其注入一些依赖关系。我想这就是API的目的。但是然后,该方法是否有效,如何将注入信息传递到视图控制器层次结构中?

因此,由于该方法在视图控制器中运行时没有错误,因此我决定直接在根视图控制器中注入信息。

所以,我在情节提要中有:

  • 一个名为“ my-window-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)
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用情节提要中的私有属性初始化视图控制器

使用情节提要和自定义View Controller初始化

使用情节提要板在UIViewController中初始化自定义UIView

在情节提要中,如何制作自定义单元以与多个控制器一起使用?

情节提要视图控制器未实例化?

从情节提要实例化的视图控制器的投射失败

台风使用情节提要与视图控制器初始化程序一起使用

在情节提要中加载选项卡栏控制器之前,如何初始化自定义启动屏幕?

使用情节提要在选项卡栏控制器中设置选定的图像

使用情节提要和选项卡控制器将标题更改为ViewControllers

iOS使用情节提要推送视图控制器时传递数据

使用通用情节提要板时,dismissViewController不会关闭呈现的视图控制器

推送segue之后(使用情节提要segues)从导航堆栈中删除视图控制器

使用情节提要IOS7将UIview控制器显示为子视图

Xcode 11:无法从带有标识符的情节提要中实例化视图控制器

在页面视图控制器中以编程方式使用情节提要中的视图控制器

自定义单元永远不会为零(不要使用情节提要)

使用情节提要创建的自定义UITableViewCell不显示标签数据-Swift

如何使用情节提要板实现自定义表格视图节的页眉和页脚

如何使用情节提要添加自定义数据源类

使用情节提要板实现自定义视图布局

自定义视图过渡,无需使用情节提要脚本(快速)

与自定义UITabbarController一起使用情节提要

无法使用情节提要将窗口连接到IBOutlet

使用自定义初始化程序swift以编程方式实例化和推送视图控制器

Swift –在App Delegate中实例化没有情节提要的导航控制器

从代码和情节提要中实例化自定义按钮-如何创建init方法

在不使用情节提要的情况下使用Swift通过View控制器传递数据

如何在视图控制器中显示不同的视图以进行调试,而不是在iOS上发布(使用情节提要)