2009-01-20 19 views
3

我正在使用Xcode和Interface Builder爲iPhone創建一個簡單的項目。雖然我瞭解代表是什麼,但我在使用它時遇到問題。作爲外部類的委託在Objective-C

我在我的界面中有一個UITextField。它在用戶點擊時顯示鍵盤,但我需要手動編程如何隱藏鍵盤。它可以使用代表完成。所以在IB中,我從庫中獲取Object,將它的類名稱設置爲Control1Delegate,然後將我的文本字段的委託出口連接到此Control1Delegate。我也有.M和.h文件這個Control1Delegate類:

Control1Delegate.h

@interface Control1Delegate : NSObject <UITextFieldDelegate> { 
} 

- (BOOL) textFieldShouldReturn:(UITextField *)textField; 

@end 

Control1Delegate.m

#import "Control1Delegate.h" 

@implementation Control1Delegate 

- (BOOL) textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 
    return YES; 
} 

@end 

但是,這是行不通的。運行時,它永遠不會到達textFieldShouldReturn方法,或者沒有msg或使用EXEC_BAD_ACCESS崩潰。有趣的是,當我將該方法移動到控制器文件(一個嚮導已生成)並從UITextField連接到該控制器(文件的所有者)時,一切都按預期工作。我看到大多數蘋果代碼教程將委託方法放入隨機對象,而不是單獨的類 - 我想知道爲什麼。我不能在單獨的班級中安排委派嗎?

我在這裏錯過了什麼?一些空指針?對象生命週期?

回答

1

Control1Delegate對象在創建後不久就被破壞。如果你想讓它們活着,所有的頂級Nib對象都必須保留。請參閱Resource Programming Guide: The Nib Object Life Cycle

文件的所有者可能有這樣的屬性,以保留對象:

@property (nonatomic, retain) IBOutlet Control1Delegate *control1delegate; 

記住釋放對象就不再需要了。

+0

非常感謝!我知道我打了一個零對象,但我無法弄清楚如何保留它。從這個答案中可以看出,儘管可能很明顯,但您必須將IB剛剛創建的委託出口與您所在的委託對象連接起來。 – rattkin 2009-01-20 19:25:00

0

您可以將委託方法放在任何類中,包括爲此目的而構建的委託方法。蘋果(和其他程序員)通常不會專門爲委託功能製作類的原因是它變得過於複雜並且難以共享數據。例如,在我的一個項目中,我可能會創建一個窗口控制器子類,用於處理窗口中的委託方法,窗口內的表視圖和窗口的工具欄。您需要操縱和維護該窗口狀態的所有內容都位於一個控制器類中。現在設想三個獨立的類(可能還有一個控制器類來管理它們)執行相同的功能 - 這是很多額外的工作,沒有真正的好處。

至於它爲什麼會崩潰,這聽起來像是你在應用程序的其他地方在內存管理上犯了一個錯誤。您可以使用調試器準確追蹤它來自哪裏。

+0

謝謝。雖然我可以理解你的觀點並想象它的用處,但我通常會反對帶有所有內容的大型控制器類。我不喜歡混合控制器方法和委託方法的方式,將它們分開,如下所示: /*委託方法從這一點開始*/ – rattkin 2009-01-20 19:13:31

0

謝謝你們兩位。不僅我現在知道如何解決我的問題,而且最終了解了如何在Nib創建過程中保留對象。在IB中創建對象是不夠的,如果它是一個新實體,它必須連接到文件所有者(具有合適的合成getter/setter)的真正ivar。

相關問題