在故事板中实例化xib时对initWithCoder的无限递归调用

时间:2012-05-04 20:13:10

标签: ios storyboard nib

为了在我的应用程序中重复使用某个子视图(基于故事板),我决定将子视图构建为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被反复调用。

在这种情况下似乎我混合了两种使用笔尖的方法,但我不清楚我哪里出错了。如果需要,我可以抛出堆栈跟踪,但它基本上是对同一函数的无限嵌套调用。

2 个答案:

答案 0 :(得分:17)

您是否碰巧将.xib文件中View的“自定义类”设置为“Widget”?

这可以解释您所看到的行为,因为initWithCoder:是从xib加载的所有内容的初始值设定项:

  1. 您的父视图(包含Widget对象)是从xib
  2. 加载的
  3. 调用Widget的initWithCoder:方法,并尝试加载Widget xib
  4. Widget xib包含带有Custom的UIView     类“Widget”,再一次,Widget对象正在初始化     initWithCoder:等等。
  5. 如果确实如此,您只需在Widget的xib中删除UIView的“Custom Class”条目。

答案 1 :(得分:3)

我有同样的问题。我的错误在于空文件的所有者类。在File的所有者中,自定义类必须为空(Widget),并且根视图必须为空。

IBActions和IBOutlets都很好。