当前位置: 首页 > 面试题库 >

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

张博涛
2023-03-14
问题内容

尝试从情节提要中自定义实例化窗口控制器时,我得到的感觉像是个错误。我正在使用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)
    }
}


 类似资料:
  • 问题内容: 我正在重建没有情节提要的应用程序,而我遇到最大麻烦的部分是以编程方式浏览视图到视图。很少有东西不用情节提要写出来,因此很难找到答案。 我的问题很简单。我有我和我,我想从前者推向后者。 在: 然后在: 打印返回零。我试着做: 当创建类时(但在ViewDidLoad外部,在类声明的正下方),并使用var 完成了推送,但这没有用。 我在想,也许解决方案是在App Delegate中创建整个应

  • The BrowserWindow module is the foundation of your Electron application, and it exposes many APIs that can change the look and behavior of your browser windows. In this tutorial, we will be going over

  • 本文向大家介绍javascript+html5+css3自定义提示窗口,包括了javascript+html5+css3自定义提示窗口的使用技巧和注意事项,需要的朋友参考一下 javascript自定义提示窗口效果图: 源码: 1.demo.jsp 2.myAlert.js 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我试图在我的应用程序上实现谷歌登录。 工作正常,但当我尝试登录时,我的logcat上出现以下错误: 2018-10-04 14:55:14.784 16313-16313/? I/AppCompatDelegate:无法实例化自定义视图充气器android。支持v7。应用程序。这是充气机。回到违约状态。JAVAlang.ClassNotFoundException:android。支持v7。应用程

  • 我有一个自定义对象,它填充。为了响应对列表中的项以及列表本身的更改,我决定使用一个提取器。下面是我的的声明和实例化: 在我下面提供的链接中,这种方法是有效的。但是Netbeans告诉我“不能转换为”。我可以理解为什么会出现这种情况,但我不明白为什么它在下面的链接中有效而不适合我,以及如果这种方法不起作用,我应该如何创建提取器并将其链接到函数。 链接: JavaFX2.0选择框问题。如何在更新对象时

  • pre { white-space: pre-wrap; } 默认情况下,窗口(window)有四个工具:collapsible、minimizable、maximizable 和 closable。比如我们定义以下窗口(window):     <div id="win" title="My Window">         window content     </div> 如需自定义工具