[英]Where to initialize custom UIView, instantiated in Interface Builder?
我有一個UIView的子類,它在XIB文件中實例化。 我需要它做一些初始化(設置一些變量和創建子視圖)。
但是,我並不總是通過Interface Builder實例化此視圖。 我也是以編程方式完成的。 在這兩種情況下,初始化都需要相同。
我指定的初始化程序是initWithValues:
.
問題是; 我在哪里進行初始化?
由於我必須在兩個不同的位置執行它,我想我需要在一個單獨的initialize
方法(或類似的東西)中重構它,並從initWithValues:
調用它initWithValues:
。
但是從IB加載時,會調用initWithCoder:
和awakeFromNib
。 我必須從哪個方法調用initialize
? 還是我打電話initWithValues:
從initWithCoder:
和什么也不做awakeFromNib
?
您應該使用initWithFrame:
初始化視圖時(因為它是指定的初始化程序)。 因此,如果你有initWithValues:
確保你從它調用initWithFrame:
這樣的東西應該用於初始化:;)
- (void)initialize{
//init your ivars here
}
- (id)initWithCoder:(NSCoder *)aCoder{
if(self = [super initWithCoder:aCoder]){
[self initialize];
}
return self;
}
- (id)initWithFrame:(CGRect)rect{
if(self = [super initWithFrame:rect]){
[self initialize];
}
return self;
}
我打算補充說明,但是mplappert的答案很清楚。 必要時使用awakeFromNib
。
這取決於您需要初始化的內容。 一旦調用了awakeFromNib
就會建立視圖的所有出口和動作連接,這與initWithCoder:
的情況不同initWithCoder:
。 因此,如果您需要依賴這些連接,請使用awakeFromNib。 否則,您可以安全地在initWithCoder:
進行所有初始化initWithCoder:
。
不幸的是,上面的答案沒有考慮到這些: - (void)awakeAfterUsingCoder - 以及在編碼器創建任何內容之后調用它的事實(每次Xib視圖一次)。 我注意到,awakeFromNib遭遇同樣的命運。 (我找到這個的原因)
另一個初始化問題是可以避免自定義視圖使用initWithCoder和initWithFrame。 如果它們被調用,延遲加載(雖然對視圖本身不那么重要),意味着你“可能”能夠修改值。 我相信我已經在initWithCoder中這樣做了,但如果你在awakeFromNib中初始化值,它至少會撤消一次。
我到目前為止:
- (void) awakeFromNib (or didMoveToSuperView);
{
BOOL called = NO;
if(!called)
{
called = YES;
}
}
我使用的另一種方法是簡單地調用所需的初始化程序,然后調用我自己的類或特定於超類的初始化程序。
我也在尋找一個可以依賴的可靠的一次性地方。 在那之前,我希望我的頭痛能在一個小時左右的時間內拯救下一個人。
史蒂夫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.