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

Posted

技术标签:

【中文标题】Swift 中的 NSWindowController。使用 Nib 进行子类化和初始化【英文标题】:NSWindowController in Swift. Subclassing and initializing with Nib 【发布时间】:2014-08-16 13:52:47 【问题描述】:

在一个测试 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:) 来初始化窗口控制器。请注意,这不是所需的行为。 Window Controller 应该使用init() 进行初始化,并且应该是 Window Controller 自己“拾取”其 Nib 文件并加载它。

【问题讨论】:

【参考方案1】:

如果您使用 init() 只是为了调用 super.init(windowNibName:),则可以改用覆盖 windowNibName 变量。

override var windowNibName: String  
    get 
        return "MyWindowNib"
    

那么应该没有必要搞乱初始化程序。

【讨论】:

在 Swift 4 中,最好这样:覆盖 var windowNibName: NSNib.Name? get return NSNib.Name(rawValue: "MyWindowNib") @Aarhus88 不起作用:属性 'windowNibName' 类型为 'NSNib.Name?' (又名 'Optional')不能覆盖类型为 'String?' 的属性【参考方案2】:

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

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

您应该选择替换子类中的所有指定初始化程序,只需在适当的情况下委托给super。授予https://***.com/a/24220904/1460929

【讨论】:

以上是关于Swift 中的 NSWindowController。使用 Nib 进行子类化和初始化的主要内容,如果未能解决你的问题,请参考以下文章

swift: Swift 中的 SnapKit 不起作用

swift中的 isKindofClass

swift Swift中的变量

swift Swift中的数组

swift SWIFT中的变量

swift Swift4中的Codable