Cocoa 如何在Swift中初始化NSWindowController?
我想从一个nib文件初始化一个窗口控制器对象,很简单吧?但我就是不能让它工作 根据我以前在ObjC的经验,我写下了以下代码:Cocoa 如何在Swift中初始化NSWindowController?,cocoa,swift,appkit,Cocoa,Swift,Appkit,我想从一个nib文件初始化一个窗口控制器对象,很简单吧?但我就是不能让它工作 根据我以前在ObjC的经验,我写下了以下代码: init() { super.init(windowNibName: "SplitWindowController") } 在应用程序委托文件中,我只需初始化并显示窗口: var myWindowController: MyWindowController = MyWindowController() myWindowController.showWindow
init() {
super.init(windowNibName: "SplitWindowController")
}
在应用程序委托文件中,我只需初始化并显示窗口:
var myWindowController: MyWindowController = MyWindowController()
myWindowController.showWindow(self)
myWindowController.window.makeKeyAndOrderFront(nil)
但是编译器给了我这个错误:
必须调用超类“NSWindowController”的指定初始值设定项。
。根据Swift版本的NSWindowController
定义,只有3个指定的初始值设定项,即init()
,init(window)
,init(coder)
。我不知道下一步该怎么办。我应该从nib文件构建一个NSCoder
,我不知道该怎么做 NSWindowController
有两个指定的初始值设定项:
init(window: NSWindow!)
init(coder: NSCoder!)
创建子类时,应调用其超类的指定初始值设定项。Xcode的最新版本强制执行这一点。通过内置语言机制(Swift)或通过NS\u指定的\u初始值设定项
macro(Objective-C)
Swift还要求在重写方便的初始值设定项时调用指定的超类初始值设定项。从Swift编程指南部分: 如果要重写的初始值设定项是方便的初始值设定项, 您的重写必须从其自身调用另一个指定的初始值设定项 子类,按照上面初始化器链接中描述的规则
在您的情况下,您可能应该重写
init(window:NSWindow!)
并从那里调用super的对应项。您就快到了。您确实可以以一种与您习惯的Obj-C代码相同的方式重写init()
,作为一个方便的初始化器:
import Cocoa
class MyWindowController: NSWindowController {
override convenience init() {
self.init(windowNibName: "<xib name>")
}
}
感谢您的解释,我想知道如何从nib文件构造NSWindow对象?我的意思是窗口对象应该从nib文件构造,对吗?如何从nib文件构造窗口?如果您的窗口控制器有一个专用的xib,您可以在文件所有者的身份检查器中将您的子类设置为“自定义类”。请注意,当从xib创建窗口控制器时,如果要在初始值设定项中执行某些特定操作,则必须重写initWithCoder而不是initWithWindow。@weichsel您能详细说明一下吗?我想将NSWindowController子类化,这样子类就知道初始化时要加载什么Nib。在Obc-C中,这是通过从“init”调用“initWithNibName:”来完成的。用Swift怎么做?我也有同样的问题。我找到的最好答案是这里的第二个答案(改为使用类工厂方法):@George see在这里回答您的问题:[子类化NSWindowController][1][1]:我在Xcode 7.3中遇到了一个“初始值设定项不会从其超类重写指定的初始值设定项”错误。删除
override
关键字可以消除错误。@尼古拉斯米亚里,很明显,自从这篇文章撰写以来,苹果已经解决了这个特定的错误。谢谢你记下来!同样改变的是,我们现在必须显式地标记未命名的参数(而不是init(Int)
,我们现在编写init(u:Int)
)。
class A {
init() { }
}
class B: A {
init(Int) {
super.init()
}
convenience init(String) {
self.init(5)
}
}
class C: B {
convenience init() {
self.init("5")
}
}