2016-03-09 126 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