我正在开发一个基于文档的应用程序。我正在为文档窗口使用专用的窗口控制器,并调用该-[NSDocument makeWindowControllers]
方法。
我的窗口控制器是这样初始化的:
- (instancetype) init
{
if (self = [super initWithWindowNibName:@"Document" owner:self]) {
}
return self;
}
这里@"Document"
是包含与项目一起创建的主文档窗口的 .xib 文件。
这里的基本原理是,这个窗口控制器总是用这种类型的窗口初始化,所以参数是硬编码的,并且隐藏在实现中-init
(同时也方便地将窗口所有者设置为self
)。
因此,实例化窗口控制器的一方(在我的例子中是文档类)不需要担心要使用哪个 nib,只需调用-init
.
问题是,我破坏了指定的初始化器链,Xcode 抱怨这些警告:
未找到超类“-initWithCoder:”的指定初始化程序的语义问题方法覆盖。
语义问题指定初始化程序缺少对超类的指定初始化程序的“超级”调用。
未找到超类“-initWithWindow:”的指定初始化程序的语义问题方法覆盖。
语义问题 指定初始化程序调用了非指定初始化程序。
我会-initWithWindowNibName:owner:
用一个来切换调用-initWithWindow:
(然后手动设置所有者,我猜?);但我不知道如何NSWindow
直接从笔尖创建一个(或者这是正确的做法)。
编辑:我刚刚发现警告被触发只是因为我在我的界面中标记-init
为。NS_DESIGNATED_INITIALIZER
我可以删除该标签并且警告消失,但这-init
是我事实上指定的初始化程序,所以我宁愿保留它。