Cocoa, Swift 4 - 当故事板与应用程序的 Main.Storyboard 文件不同时,如何以非编程方式嵌入自定义 NSViewController?

问题描述

我正在 Swift 4/Xcode 12 中更新 MacOS 程序。我有一个自定义视图控制器“HelloWorldViewController”,以前我在窗口中单独显示它。 HelloWorldViewController 使用故事板 HelloWorldViewController.storyboard 而不是 Main.Storyboard。这是用于切换包含工作正常的视图的窗口的代码

    func toggleHelloWorldWindow() {
        
        if helloWorldViewCtrl == nil {
           
            let myStoryboard = nsstoryboard(name: nsstoryboard.Name("HelloWorldView"),bundle: nil)
            helloWorldWindowCtrl = myStoryboard.instantiateController(withIdentifier: nsstoryboard.SceneIdentifier("HelloWorldWindow")) as? NSWindowController

            guard helloWorldWindowCtrl != nil else {return}
            helloWorldViewCtrl = helloWorldWindowCtrl!.window!.contentViewController as? HelloWorldViewController
        }
        
        if let myWindowController = helloWorldWindowCtrl {
            
            if myWindowController.window!.isVisible {
                myWindowController.window!.orderOut(self)
            } else {
                myWindowController.showWindow(helloWorldWindowCtrl)
            }
        }
    }

不过,我认为使用控制器的最佳方式是将其嵌入主应用程序而不是单独的窗口。似乎这样做的方法是使用 NSContainerView,如果我在与主应用程序相同的故事板文件中拥有自定义视图的故事板,我就可以正常工作。

但在我的一生中,我一直无法让它指向外部故事板。当我为自定义视图页面上的项目设置值时,它总是在自定义视图控制器的 viewDidLoad 中崩溃,因为它们都为零(即,视图没有呈现?)

class HelloWorldViewController: NSViewController {
    
    @IBOutlet weak var helloWorld: NSTextField!
    
    override func viewDidLoad() {

        super.viewDidLoad()        
        helloWorld.stringValue = "Hello world..." (crashes)
    }    
}

经过两天的大惊小怪,它能够以编程方式使其工作(这对我的目的来说很好,并且可能是我会坚持的解决方案)但我仍然想知道我在尝试的过程中遗漏了什么只用故事板来做吗?我尝试设置一个 segue,但找不到任何方法来告诉它故事板文件名,仅使用场景标识符会导致相同的崩溃。

(主应用程序的 viewDidLoad() 中的程序版本运行良好)

       let myStoryboard = nsstoryboard(name: nsstoryboard.Name("HelloWorldView"),bundle: nil)
        
        if let helloWorldWindowCtrl = myStoryboard.instantiateController(withIdentifier: nsstoryboard.SceneIdentifier("HelloWorldWindow")) as? NSWindowController,let controller = helloWorldWindowCtrl.window!.contentViewController as? HelloWorldViewController
        {
            addChild(controller)
            controller.view.translatesAutoresizingMaskIntoConstraints = false
            helloWorldView.addSubview(controller.view)
      
            NSLayoutConstraint.activate([
                controller.view.leadingAnchor.constraint(equalTo: helloWorldView.leadingAnchor,constant: 0),controller.view.trailingAnchor.constraint(equalTo: helloWorldView.trailingAnchor,controller.view.topAnchor.constraint(equalTo: helloWorldView.topAnchor,controller.view.bottomAnchor.constraint(equalTo: helloWorldView.bottomAnchor,constant: 0)
            ])
        }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)