gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 04:07:58 25 4
gpt4 key购买 nike

为了在我的整个应用程序(基于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com