Swift中的NSWindowController。使用Nib进行子类化和初始化

5
在一个测试的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中实现这一点?我没有看到一个直接的方法来做到这一点。
备注:我已经看到其他关于这个主题的问题,但是据我所能理解,所有的解决方案都指向通过调用init(windowNibName:)来初始化Window Controller。请注意,这并不是期望的行为。Window Controller应该通过init()进行初始化,并且它应该是Window Controller本身“拾取”其Nib文件并加载它。
2个回答

5

如果你只是使用init()方法来调用super.init(windowNibName:),那么你可以直接重写windowNibName变量。

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

那么就不需要动初始化器了。

在Swift 4中,更好的写法是:override var windowNibName: NSNib.Name? { get { return NSNib.Name(rawValue: "MyWindowNib") }} - Aarhus88
@Aarhus88 这个不起作用:类型为 'NSNib.Name?' (又名 'Optional<NSString>') 的属性 'windowNibName' 无法覆盖具有类型 'String?' 的属性。 - Extra Savoir-Faire

0

你可以创建自己的便捷初始化器:

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

你应该选择在子类中替换所有指定的初始化器,只需在适当的情况下委托给super。请参考https://dev59.com/4WAf5IYBdhLWcg3w2Fl6#24220904


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接