init和awakeFromNib

时间:2011-06-22 08:19:40

标签: cocoa macos

我想了解为什么如果我尝试在init方法中为一个对象(如NSButton)设置值(即enAlValue或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 个答案:

答案 0 :(得分:41)

-init之后设置 -awakeFromNib之前设置。如果您想要访问网点,则需要在-awakeFromNib或其他设置出口后执行的方法(例如-[NSWindowController windowDidLoad])。

加载nib文件时:

  1. 分配/初始化nib文件中的对象,接收-init-initWithFrame:-initWithCoder:
  2. 重新建立所有连接。这包括操作,出口和绑定。
  3. -awakeFromNib被发送到接口对象,文件所有者和代理对象。
  4. 您可以在Resource Programming Guide中了解有关nib加载过程的更多信息。

答案 1 :(得分:5)

在初始化时,视图将无法正确设置,并且插座未连接。这就是你在这种情况下使用awakeFromNib:的原因 - 所有内容都已设置好并可以使用。