2011-06-22 75 views
1

我看到這個代碼:UIKit:以編程方式調用awakeFromNib?

CoolButton *coolButton = [[CoolButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 60.0f, 25.0f)]; 
[coolButton awakeFromNib]; 
// ... 
[coolButton release]; 

CoolButton子類UIButton。以編程方式致電awakeFromNib可以嗎?

如果我想要在-[CoolButton awakeFromNib]中完成與我想要以編程方式創建對象而不是從nib文件創建對象相同的事情,那麼最佳做法是什麼?

我應該只是定義一個方法,並在-[CoolButton awakeFromNib]-[CoolButton initWithFrame]中調用它?或者,在這兩種情況下,我是否應該定義另一個初始化方法:是否以編程方式或從nib文件創建CoolButton

回答

4

不,沒有一種方法既可以調用在代碼中創建的對象,也可以調用從NIB創建的對象。您應該編寫一個包含公共初始化邏輯的獨立方法,並從awakeFromNibinitWithFrame:中調用它。

+1

'initWithCoder:'呢?根據文檔,從nib文件加載'UIView'子類時會被調用。 'initWithFrame:'調用'-initWithCoder:'?如果是這樣,那麼我可以只實現'-initWithCoder:'? – ma11hew28

2

那麼只要設置了XIB和NIB之間的所有連接,就會調用awakeFromNib。我相信awakeFromNib在從nib文件初始化時會在對象上調用。因此,如果您以編程方式創建它,而不是使用NIB文件創建它,則不需要撥打awakeFromNib。另一方面,調用initWithFrame聽起來像是要走的路。在這個函數中,你可以編程創建你的視圖,而不需要一個nib文件。我可能是錯的,但我認爲initWithFrame被調用,無論您的視圖是否用nib創建。

+3

'initWithFrame:'在Mac OS的AppKit中被調用,但不在iOS的UIKit中,按照以下文檔:http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs /CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW18 – Alex

+0

噢好吧,我沒有意識到這一點。謝謝! –