在storyboard中实例化xib时,无休止的recursion调用initWithCoder

为了在整个应用程序(这是故事板为基础)中重新使用某个子视图,我决定将子视图构build为一个笔尖,然后加载它。为此,我做了以下操作:

我有一个UIView子类,我们可以调用Widget。 我创build了一个相应的xib文件,将File owner属性设置为我的新子类,然后连接IBOutlets。

然后,在我的故事板中,我有一个视图控制器内的uiview,并将其类设置为我创build的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被反复调用。

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

你碰巧把你的.xib文件中的视图的“自定义类”设置为“Widget”?

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

  1. 包含Widget对象的父视图是从xib加载的
  2. Widget的initWithCoder:方法被调用,并尝试加载Widget xib
  3. Widget xib包含一个带有自定义类“Widget”的UIView ,同样,Widget对象正在使用initWithCoder:等进行初始化。

如果确实如此,你所要做的就是在Widget的xib中移除UIView的“Custom Class”条目。

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

IBActions和IBOutlets都很好。