ios - 在 Storyboard中实例化 xib 时对 initWithCoder 的无限递归调用

标签 ios storyboard nib

为了在我的整个应用程序(基于 Storyboard )中重复使用某个 subview ,我决定将 subview 构建为一个 nib,并将其加载。为此,我完成了以下操作:

我有一个可以调用 Widget 的 UIView 子类。我创建一个相应的 xib 文件,将文件所有者属性设置为我的新子类,连接 IBOutlets。

然后,在我的 Storyboard中,我在 View Controller 中有一个 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 被一遍又一遍地调用。

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

最佳答案

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

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

  1. 您的父 View ,其中包含一个 Widget 对象,是从 xib 加载的
  2. Widget 的 initWithCoder: 方法被调用,并尝试加载 Widget xib
  3. Widget xib 包含一个带有自定义的 UIView 类“Widget”,因此再次初始化一个 Widget 对象 initWithCoder:

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

关于ios - 在 Storyboard中实例化 xib 时对 initWithCoder 的无限递归调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10455521/

相关文章:

storyboard - 非法配置: Compiling IB documents for earlier than iOS 7 is no longer supported

cocoa - NSView、NSViewController 和 MainMenu.xib 究竟是如何组合在一起的?

ios - UITextView 上的奇怪警告消息

swift - Swift 错误 : "unrecognized selector sent to instance 0x7fa208d0a2b0"

ios - Swift 中的 SOAP 网络服务

java - 使用路径找不到元素

ios - 将 UITextField 键盘置于最前面

iphone - 如何以不同方式格式化 UILabel 字符串中的不同字符?

ios - 通过代码加载 Storyboard场景

iphone - 带有属性标签的 iOS 7 Storyboard本地化