我有一个MainMenu.xib,而AppController是它的文件所有者。我添加了-(void)awakeFromNib方法,效果很好。现在,在awakeFromNib路上进行的各种修复都停止了,我不知道为什么。它拥有xib,因此在未存档时应调用它。这是怎么回事?

编辑:

好吧,我将awakeFromNib重命名为something,并从init调用了它。仍然对为什么awakeFromNib不是这样感到困惑。我那里也有一个+(void) initialize方法,这可能会使事情变得混乱吗?

- (id)init {
    self = [super init];
    if (self) {
        [self something];
    }
    return self;
}


-(void)something {
    NSLog(@"yup");
}

最佳答案

在笔尖中设置文件所有者的类名仅是为了使您可以告诉Xcode向对象显示哪些对象的出口和操作,从而可以进行连接。当应用程序运行并且笔尖被加载时,它并不影响哪个对象实际上是文件的所有者。

无论您在Xcode的检查器中为FO设置了什么类名,MainMenu笔尖的“文件所有者”始终是应用程序对象。将其设置为NSApplication [1]以外的任何类名是错误的。

在运行应用程序时,您应该在控制台中找到有关尝试连接的AppController的所有插座或操作的错误消息。它们无法连接,因为应用程序对象没有它们。

重新在nib编辑器中更改类名称,然后在MainMenu nib中将AppController创建为自定义对象。




  好吧,我将awakeFromNib重命名为something,并从init调用了它。


这意味着init被调用,这意味着您正在调用它。这是在笔尖中创建它的有效替代方法,尽管如果awakeFromNib不在笔尖中或不拥有它,则您不应覆盖它。

您的选择:继续使用allocinit创建AppController,或者删除该代码并在MainMenu nib中创建它。



[1]:或者,如果您继承了NSApplication的子类,并将应用程序捆绑包的主体类更改为该子类,则该子类的名称。

关于objective-c - cocoa -不叫awakeFromNib,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12629241/

10-09 02:19