斯威夫特的NSWindowController。使用Nib进行子类化和初始化

时间:2014-08-16 13:52:48

标签: cocoa swift subclass nib nswindowcontroller

在测试Swift项目中,我是NSWindowController的子类。我的NSWindowController子类旨在使用特定的Nib文件。因此,希望在初始化我的窗口控制器时,窗口控制器实例自动加载nib文件。在Objective-C中,这是通过以下方式实现的:

@implementation MyWindowController

- (id)init {
    self = [super initWithWindowNibName:"MyWindowNib"]
    if (self) {
        // whatever
    }
    return self
}

@end

现在,在Swift中,这是不可能的:init()无法调用super.init(windowNibName:),因为后者被声明为不是指定的初始化程序,而是NSWindowController的方便。

如何在Swift中完成?我没有看到一种直截了当的方式。

P.S。:我已经看到了关于这个主题的其他问题,但是,只要我能够理解,解决方案都指向通过调用init(windowNibName:)初始化窗口控制器。请注意,这不是理想的beheaviour。窗口控制器应该用init()初始化,它应该是窗口控制器本身“拾取”其Nib文件并加载它。

2 个答案:

答案 0 :(得分:5)

如果您仅使用init()来致电super.init(windowNibName:),则可以改为覆盖windowNibName变量。

override var windowNibName: String  {
    get {
        return "MyWindowNib"
    }
}

然后应该没有必要弄乱初始化器。

答案 1 :(得分:0)

您可以创建自己的便利初始化程序:

override convenience init() {
    self.init(windowNibName: "MyWindowNib")
}

您应该选择替换子类中的所有指定初始值设定项,只需在适当的位置委托super。授予https://stackoverflow.com/a/24220904/1460929