2011-06-22 38 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: - 所有設置都已準備就緒,可以使用。