我正在使用更标准的+(BOOL)loadNibNamed:owner:
方法替换我们的macOS应用中已弃用的initWithWindowNib
方法,并且遇到了关于基于文档的应用编程指南for Mac 的Apple指南。一节特别引起了我的注意:An NSWindowController Subclass Manages Nib Files
对于记录,它说:
期望告诉
NSWindowController
对象加载哪个nib文件 (通过它的initWithWindowNib ...方法)因为它是通用的 实现所有窗口控制器的默认行为。 但是,当你编写NSWindowController
的子类时,那就是 子类几乎总是设计用于控制用户界面 包含在特定的nib文件中,并且您的子类不起作用 使用不同的nib文件。因此不方便 容易出错,因为子类的实例化器必须告诉它 要加载哪个nib文件。通过覆盖
init
方法来调用此问题即可解决此问题 超类的initWithWindowNibName:
方法,具有正确的笔尖名称。 然后实例化器只使用init
,控制器正确 nib文件。您还可以覆盖initWithWindowNib...
方法 记录错误,如图2-4所示,因为没有实例化器 试着告诉你的子类使用哪个nib文件。这是一个很好的 设计用于任何NSWindowController
子类的想法 特定的nib文件使用这种技术。你应该只做其他事情 如果你只是扩展的基本功能 您的子类中的NSWindowController
并没有将其绑定 任何特定nib文件的功能。
非常合理,让我们试一试。
注意:有一个question与相同的文档部分相关,但它有一个不同的问题,提出了一个不同的问题,并没有使用现代Objective-C语法。
我的MainWindowDelegate.h现在有:
- (instancetype)init NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithWindow:(nullable NSWindow *)window NS_UNAVAILABLE;
- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE;
- (instancetype)initWithWindowNibName:(NSNibName)windowNibName NS_UNAVAILABLE;
- (instancetype)initWithWindowNibName:(NSNibName)windowNibName owner:(id)owner NS_UNAVAILABLE;
- (instancetype)initWithWindowNibPath:(NSString *)windowNibPath owner:(id)owner NS_UNAVAILABLE;
MainWindowDelegate.m现在有:
- (instancetype)init {
self = [super initWithWindowNibName:@"MainWindowWin"];
if (self) {
// Initialization code here.
}
return self;
}
AppDelegate
中唯一可用的初始值设定项正确为init
(如果我尝试使用initWithWindowNibName
,则会收到错误'initWithWindowNibName:' is unavailable
)。到目前为止一切都很好,而且效果非常好。
但现在我有一堆警告 ......
- (instancetype)init {
行
指定的初始化程序错过了超级'调用超类的指定初始化程序
self = [super initWithWindowNibName:@"MainWindowWin"];
行
指定的初始值设定项调用了非指定的初始化程序
如果这是建议的Apple子类化NSWindowController的方法为什么所有这些警告?我错过了这一点吗?如何修复警告并仅保留init
初始化程序可用性?