6

为了在整个应用程序中重用某个子视图(基于故事板),我决定将子视图构建为 nib,并将其加载。为此,我做了以下工作:

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

然后,在我的故事板中,我在视图控制器中有一个 uiview,我将它的类设置为我创建的 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 被一遍又一遍地调用。

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

4

2 回答 2

19

您是否碰巧在 .xib 文件中将视图的“自定义类”设置为“小部件”?

这将解释您所看到的行为,因为initWithCoder:它是从 xib 加载的所有内容的初始化程序:

  1. 包含 Widget 对象的父视图是从 xib 加载的
  2. Widget 的initWithCoder:方法被调用,并尝试加载 Widget xib
  3. 小部件 xib 包含UIView带有自定义类“小部件”的 Widget,因此再次使用 来初始化小部件对象 initWithCoder:,等等。

如果确实如此,您所要做的就是在您的 Widget 的 xib 中删除 UIView 的“自定义类”条目。

于 2012-05-04T22:27:40.313 回答
3

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

IBActions 和 IBOutlets 都很好。

于 2016-03-30T07:06:14.693 回答