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您可以创建自己的便利初始化程序:
override convenience init()
self.init(windowNibName: "MyWindowNib")
您应该选择替换子类中的所有指定初始化程序,只需在适当的情况下委托给super
。授予https://***.com/a/24220904/1460929
【讨论】:
以上是关于Swift 中的 NSWindowController。使用 Nib 进行子类化和初始化的主要内容,如果未能解决你的问题,请参考以下文章