可可 – 将Swift和init(windowNibName)中的NSWindowController子
我试图在Swift中启动一个基于Cocoa项目的新文档,并想创建一个NSWindowController的子类(如Apple的文档应用指南中所推荐的)。在ObjC中,你将创建一个NSWindowController子类的实例,发送initWithWindowNibName:消息,并相应地实现,调用superclasses方法。
在Swift中,init(windowNibName)只能作为一个方便的初始化器,NSWindowController的指定的初始化器是init(window),它显然需要我在一个窗口中传递。 我不能调用super.init(windowNibName)从我的子类,因为它不是指定的初始化,所以我显然必须实现方便init(windowNibName),这反过来需要调用self.init(window)。但如果我有我的nib文件,如何访问nib文件的窗口发送到该初始化程序?
你需要覆盖NSWindowController(init(),init(window)和init(coder))的所有三个初始化器,或者不覆盖它们,在这种情况下,你的子类将自动继承init(windowNibName)你将能够使用超类的方便初始化构造它:
// this overrides none of designated initializers class MyWindowController: NSWindowController { override func windowDidLoad() { super.windowDidLoad() } } // this one overrides all of them // // Awkwardly enough,I see only two initializers // when viewing `NSWindowController` source from Xcode,// but I have to also override `init()` to make these rules apply. // Seems like a bug. class MyWindowController: NSWindowController { init() { super.init() } init(window: NSWindow!) { super.init(window: window) } init(coder: NSCoder!) { super.init(coder: coder) } override func windowDidLoad() { super.windowDidLoad() } } // this will work with either of the above let mwc: MyWindowController! = MyWindowController(windowNibName: "MyWindow") 这在语言指南中的“初始化/自动初始化器继承”中介绍:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |