2016-03-09 125 views
-1

您好我創建了UIView子類MightyPickerView,它是從xib像這樣加載的。如何初始化從xib加載的UIView子類?繼承問題

- (instancetype)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 

    if (self) { 
    NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"MightyPickerView" owner:self options:nil]; 

    if ([arrayOfViews count] < 1) { 
     return nil; 
    } 
    if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[MightyPickerView class]]) { 
     return nil; 
    } 
    self = [arrayOfViews objectAtIndex:0]; 
    } 
    return self; 
} 

直到現在,這個工程還很好,我在很多以前的項目中使用這個沒有任何問題。但是現在我想創建MightyPickerView的子類TimePickerView

- (instancetype)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; // here's the problem 
    if (self) { 
    [self setupSizes]; 
    } 
    return self; 
} 

當我運行的應用程序崩潰

[MightyPickerView setupSizes]: unrecognized selector sent to instance 0x137e53660 

的問題是,這條線self = [super initWithFrame:frame];回報MightyPickerView代替TimePickerView。

我應該如何編寫MightyPickerView的initializor,以便它在需要時返回子類。

+0

不要在你的MightyPickerView.xib中有任何TimePickerView插座嗎? –

+0

TimePickerView不是MightyPickerView的屬性。它是MightyPickerView的子類。 MightyPickerView不應該知道任何關於TimePickerView的信息。 –

+0

而不是超級初始化。你可以嘗試[[self alloc] init]嗎? –

回答

0

你在做什麼是沒有意義的。您不應該誤用initWithFrame讓您的視圖轉向並從筆尖加載本身。如果要從筆尖加載MightyPickerView,請從筆尖加載它,即有一些其他班級說[[NSBundle mainBundle] loadNibNamed:@"MightyPickerView" owner:nil options:nil];並拉出視圖。要封裝,也許使用類工廠方法。不要在init內部做這種不雅的自我替換。它可能已經顯然工作,但它總是錯誤的行爲,現在它已經回來咬你。

+0

好的。這是很好的答案,因爲我不知道這是不是從xib創建視圖的推薦方式。謝謝 –

+0

這是真的,但改變它並不能解決他從根本上加載視圖永遠不會是正確的子類的基本問題。 – dan

+0

@dan肯定的是,如果這就是筆尖裏的東西。 – matt