如何对NSWindowController进行子类化

时间:2018-03-21 09:56:57

标签: objective-c macos nswindowcontroller apple-documentation

我正在使用更标准的+(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文件的功能。

     

Figure 2-4  Loading a nib file that is controller specific

非常合理,让我们试一试。

注意:有一个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初始化程序可用性?

0 个答案:

没有答案