【问题标题】:Create NSWindow from nib name从 nib 名称创建 NSWindow
【发布时间】:2014-06-13 13:03:45
【问题描述】:

我正在尝试从自己的 nib 文件创建 NSWindow,但它似乎比我预期的要难......

NSWindowController 提供了一个init(windowNibName: String?) 方法,它可以被子类覆盖。似乎不可能在不覆盖它的情况下调用基类'init(windowNibName: String?)(编译器显示一条错误消息,指出没有采用该 String 参数的初始化程序)。

但是当覆盖这个init(...) 方法时,您必须遵循初始化链,这会迫使您调用指定的初始化器。这个指定的初始化器是init(window: NSWindow!)

这就是我目前陷入困境的地方......似乎我必须(以某种方式)创建一个 NSWindow 对象,以便将其传递给指定的初始化程序。 但我不知道如何从 nib 文件创建 NSWindow。

有人知道吗?

【问题讨论】:

    标签: cocoa swift


    【解决方案1】:

    我认为这是错误。

    创建自己的 init 方法并自己加载 xib 文件,如下所示:

    class MyWindowController: NSWindowController {
    
        init() {
            super.init(window: nil)
    
            /* Load window from xib file */
            NSBundle.mainBundle().loadNibNamed("MyWindow", owner: self, topLevelObjects: nil)
        }
    
    }
    

    【讨论】:

    • 我试过这个,但它似乎不起作用。 loadNibNamed(...) 方法似乎加载了笔尖(至少它返回 true),但控制器内的窗口仍然是 NIL。加载NIB后是否必须明确设置窗口?
    • 为我工作。谢谢。
    • 这对我根本不起作用,TheGoonie 的回答确实如此。
    【解决方案2】:

    我发现我的错误...

    我将自己的 WindowController 作为“文件所有者”放入 NIB 文件中,但忘记将其“窗口”属性链接到 NIB 中的窗口(在 Interface Builder 中)。

    现在它可以正常工作了。

    谢谢@juniperi

    【讨论】:

    • 另外一定要在身份检查器中设置nib的FileOwner使用自定义的NSWindowController类,将窗口出口拖到窗口然后将自定义的NSWindowController实例作为属性存储到类上,否则会得到垃圾收集。
    猜你喜欢
    • 2011-11-25
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多