簡體   English   中英

在哪里初始化自定義UIView,在Interface Builder中實例化?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM