2011-06-22 39 views
12

我想知道为什么如果我尝试在init方法中设置对象(如NSButton)的值(即,setAlphaValue或setTitle)什么都没有发生,但是如果我在awakeFromNib中调用setter函数,它会正常工作。init和awakeFromNib

@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 
+0

是您的按钮IBOutlet? – Eimantas

回答

37

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

当笔尖文件被加载:在笔尖文件

  1. 对象被分配的/初始化,在接受-init-initWithFrame:,或-initWithCoder:
  2. 所有连接被重新建立。这包括行动,网点和绑定。
  3. -awakeFromNib被发送到接口对象,文件的所有者和代理对象。

您可以在Resource Programming Guide中阅读有关笔尖加载过程的更多信息。

+1

+1更快更长。 :) – Eiko

+0

谢谢!完美答案(我需要等待几分钟才能接受:)) – MatterGoal

+3

我想补充一点:“不能保证nib加载代码调用awakeFromNib对象的方法的顺序。在OS X中,Cocoa试图最后调用文件所有者的awakeFromNib方法,但不保证这种行为如果你需要在加载时进一步配置你的nib文件中的对象,最合适的时候是在你的nib加载调用返回之后。 ,所有的对象都被创建,初始化并可以使用。“从资源编程指南在这个答案。 –

5

在init中,视图将无法正确设置,并且插座未连接。这就是为什么你在这种情况下使用awakeFromNib: - 所有设置都已准备就绪,可以使用。