在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加载的所有东西的初始化器:
- 包含Widget对象的父视图是从xib加载的
- Widget的
initWithCoder:
方法被调用,并尝试加载Widget xib - Widget xib包含一个带有自定义类“Widget”的
UIView
,同样,Widget对象正在使用initWithCoder:
等进行初始化。
如果确实如此,你所要做的就是在Widget的xib中移除UIView的“Custom Class”条目。
我有同样的问题。 我的错误是在空的文件的所有者类。 在文件的所有者自定义类中,必须不为空(Widget),并且根视图必须为空。
IBActions和IBOutlets都很好。