【问题标题】:Swift: [NSNib _initWithNibNamed:bundle:options:] could not load the nibNameSwift:[NSNib _initWithNibNamed:bundle:options:] 无法加载 nibName
【发布时间】:2020-06-29 15:08:42
【问题描述】:

我正在构建一个用于生产的 Cocoa 应用程序,当我为没有 NSStoryboard 实例化的路由创建 NSViewController 时,我收到了如下错误。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[NSNib _initWithNibNamed:bundle:options:] could not load the nibName: ContentFully.AnotherController in bundle (null).

实际上我通过使用NSViewController 添加NSStoryboard 解决了我的问题,但我想了解当我以编程方式调用它时发生了什么以及为什么会崩溃?

工作场景

let storyboard = NSStoryboard(name: "Dashboard", bundle: nil)
let vc = storyboard.instantiateInitialController() as! AnotherController

崩溃场景

let vc = AnotherController()
self.view.window?.contentViewController = vc

即使我完全以编程方式创建一个与NSStoryboard 无关的类,当我更改contentViewController 时,我也无法使用它。是否需要在NSBundle 中的每个控制器中搜索Swift

提前致谢

【问题讨论】:

    标签: swift cocoa


    【解决方案1】:

    一个非常简单的工作版本是:

    import Cocoa
    
    class AnotherController: NSViewController {
    
        override func loadView() {
            view = NSView(frame: NSMakeRect(0.0, 0.0, 400.0, 270.0))
            let label = NSTextField(labelWithString: "Another Controller")
            view.addSubview(label)
        }
        
    }
    

    我可以使用您所说的代码从我的第一个控制器中调用它崩溃并获得预期的结果。

    @IBAction func replaceMe(_ sender: Any) {
        let vc = AnotherController()
        self.view.window?.contentViewController = vc
    }
    

    【讨论】:

    • 感谢您的回答,但我已经尝试了所有创建类的方法(以编程方式,覆盖loadView(),或者只是实现自定义init() 方法)。如果可能的话,你能提供一个例子来为我的情况创建一个控制器吗?
    • @elia 答案已更改为显示代码。 (显然它需要更多的工作来调整大小和约束。最后,故事板的实现可能会更简单。)
    • 是的,谢谢菲利普。我了解到,当我使用 NSStoryboard + Programmatically 方法时,我必须使用 loadView 来以编程方式使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多