2011-08-15 87 views
2

在viewDidLoad或init方法中設置UITextField的委託是否是一種好的做法? 我試着在init方法中將委託設置爲self,但是當我將代碼移動到viewDidLoad中時,它沒有調用相應的委託方法,它將自己設置爲委託來註冊? 看來我應該可以用任何一種方法來設置它,如果有人能幫我解決這個問題,我將非常感激。我應該在哪種方法中設置UITextField的委託?

-(id) init { 
    self = [super init]; 
    if (self) 
     textField.delegate = self;  //this text field is an IBOutlet 
     //some other code here as well 
    return self; 
} 

OR

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    textField.delegate = self; 
} 

回答

3

如果你的文本字段爲IBOutlet然後直到viewDidLoad方法被調用您的文本字段將是nil(因此你將委託設爲nil對象)。當viewDidLoad被調用時,它的字面意思是該視圖已加載,並且所有IBOutlet和IBActions都已連接並可供您使用。

+0

完美無缺,謝謝。 – SaamJB

1

假設您的類是UIViewController並從NIB加載(因爲您有一個IBOutlet),要覆蓋的正確的init方法是initWithCoder:(NSCoder*)decoder。這是怎麼回事,現在:

  1. 的iOS載入你的NIB文件,並創建你的UIViewController
  2. 的UIViewController中通過調用其initWithCoder:(NSCoder*)decoder方法創建的。
  3. initWithCoder做的第一件事是在它已經解碼了NIB之前,請致電init,因此您的代碼爲
  4. 因爲還沒有解碼的NIB的是,你的textField IBOutlet中還尚未設置(如果您調試它,你應該能夠看到它的價值爲零的init內)。因此設置代理不會執行任何操作。

最簡單的處理方法的確是在viewDidLoad方法中設置您的代理;它不能在init中完成。然而,它可以通過重寫initWithCoder來完成:

- (id)initWithCoder:(NSCoder*)decoder { 
    self = [super initWithCoder:decoder]; 
    if (self) 
     textField.delegate = self; 
    return self; 
} 

這個時候你等到UIViewController的實施initWithCoder已經完成解碼NIB等所有的網點已設置。

+0

哪個是最符合iOS標準的?我應該在viewDidLoad中還是在initWithCoder中設置委託? – SaamJB

+0

你最應該在'viewDidLoad'中設置你的委託,因爲當你的應用程序收到內存警告並且你的插座將會丟失(至少它應該在viewDidUnload中未設置)時,控制器的視圖可能會被卸載。 – Eimantas

相關問題