Cocoa - awakeFromNib 没有被调用

Posted

技术标签:

【中文标题】Cocoa - awakeFromNib 没有被调用【英文标题】:Cocoa - awakeFromNib is not called 【发布时间】:2012-09-27 20:06:41 【问题描述】:

我有一个 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");

【问题讨论】:

【参考方案1】:

在 nib 中设置 File's Owner 的类名只是为了告诉 Xcode 向您显示哪些对象的出口和操作,以便您可以连接。当应用程序运行并加载 nib 时,它不会影响实际上文件所有者的对象。

无论您在 Xcode 的检查器中为 FO 设置什么类名,MainMenu nib 的 File's Owner 始终是应用程序对象。将其设置为任何类名,但 NSApplication[1] 是错误的。

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

在 nib 编辑器中更改类名,并在 MainMenu nib 中将您的 AppController 创建为自定义对象。


好吧,我将 awakeFromNib 重命名为 something,并从 init 中调用它......这行得通。

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

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


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

【讨论】:

嘿,我似乎记得几个月前在主 xib 中弄乱了自定义对象,我敢打赌我删除了它。我试图调用的代码检查首选项以获取一些数据。现在我认为把它放在 awakeFromNib 中实际上是一个错误的地方。

以上是关于Cocoa - awakeFromNib 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

目标 C:init 和 awakeFromNib

IBOutlet 未在 Cocoa MVC 项目中设置

从 Cocoa 中的其他 nib(即 Interface Builder)加载 nib

AwakeFromNib 没有出口

awakeFromNib 没有调用但显示 xib

如何在同一类的 awakeFromNib 方法中获取当前视图控制器?