初始化和awakeFromNib

16

我想了解为什么如果我在init方法中尝试为一个对象(比如NSButton)设置值(例如setAlphaValue或setTitle),什么也不会发生,但是如果我在awakeFromNib中调用setter函数,则它可以正常工作。

@interface appController : NSObject {
    NSButton *btn;
}
@end;

@implementation appController
-(void)awakeFromNib {
   //it works
   [btn setTitle:@"My title"];
}

-(id)init { 
    self = [super init];
    if(self){
        //it doesn't works
        [btn setTitle:@"My title"];
    }
}
@end
2个回答

46

Outlet在-init之后和-awakeFromNib之前设置。如果想要访问outlet,需要在-awakeFromNib或其他在outlet设置后执行的方法中进行(例如-[NSWindowController windowDidLoad])。

当nib文件被加载时:

  1. nib文件中的对象被分配/初始化,收到-init-initWithFrame:-initWithCoder:
  2. 所有连接都会重新建立,包括操作、outlet和绑定。
  3. -awakeFromNib被发送到接口对象、文件的所有者和代理对象。

您可以在Resource Programming Guide中阅读更多关于nib加载过程的内容。


谢谢!完美的答案(我需要再等几分钟才能接受它:)) - MatterGoal
3
我想补充一下:“笔尖加载代码调用对象的awakeFromNib方法的顺序不能保证。在OS X中,Cocoa会尝试最后调用File's Owner的awakeFromNib方法,但不保证这种行为。如果您需要在加载时进一步配置nib文件中的对象,则最适合的时间是在nib加载调用返回后进行。此时,所有对象都已创建,初始化并准备好使用。”来自Resource Programming Guide在这个答案中。 - Helin Wang

5

在init中,视图不会被正确设置,插座也没有连接。这就是为什么在这种情况下使用awakeFromNib:的原因——一切都已经设置好并准备好使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接