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

Chr*_*ris 5 storyboard nib ios

为了在我的应用程序中重复使用某个子视图(基于故事板),我决定将子视图构建为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;
}
Run Code Online (Sandbox Code Playgroud)

应用程序此时会崩溃,并在此处设置断点显示initWithCoder被一遍又一遍地调用.

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

And*_*Ley 18

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

这可以解释你所看到的行为,因为initWithCoder:是从xib加载的所有东西的初始化器:

  1. 您的父视图(包含Widget对象)是从xib加载的
  2. initWithCoder:调用Widget的方法,并尝试加载Widget xib
  3. Widget xib包含一个UIView带有Custom Class"Widget",因此,Widget对象正在初始化 initWithCoder:,等等.

如果确实如此,您只需要在Widget的xib中删除UIView的"Custom Class"条目.