为了在我的应用程序中重复使用某个子视图(基于故事板),我决定将子视图构建为nib,然后加载它。为此,我做了以下操作:
我有一个UIView子类,我们可以调用Widget。我创建了一个相应的xib文件,将File owner属性设置为我的新子类,连接IBOutlets。
然后,在我的故事板中,我在视图控制器中有一个uiview,我将它的类设置为我创建的Widget类。
在widget类中,我覆盖initWithCoder,并在那里加载nib,如下所示:
-(id)initWithCoder:(NSCoder *)aDecoder{
if ((self = [super initWithCoder:aDecoder])){
[self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"Widget" owner:self options:nil] objectAtIndex:0]];
}
return self;
}
应用程序此时会崩溃,并在此设置断点显示initWithCoder被反复调用。
在这种情况下似乎我混合了两种使用笔尖的方法,但我不清楚我哪里出错了。如果需要,我可以抛出堆栈跟踪,但它基本上是对同一函数的无限嵌套调用。
答案 0 :(得分:17)
您是否碰巧将.xib文件中View的“自定义类”设置为“Widget”?
这可以解释您所看到的行为,因为initWithCoder:
是从xib加载的所有内容的初始值设定项:
initWithCoder:
方法,并尝试加载Widget xib UIView
类“Widget”,再一次,Widget对象正在初始化
initWithCoder:
等等。如果确实如此,您只需在Widget的xib中删除UIView的“Custom Class”条目。
答案 1 :(得分:3)
我有同样的问题。我的错误在于空文件的所有者类。在File的所有者中,自定义类必须为空(Widget),并且根视图必须为空。
IBActions和IBOutlets都很好。