Endless recursive calls to initWithCoder when instantiating xib in storyboard

冷暖自知 提交于 2019-12-19 08:04:21

问题


In order to re-use a certain subview throughout my application (which is storyboard based), I decided to build the subview as a nib, and load it in. To do this, I have done the following:

I have a UIView subclass we can call Widget. I create a corresponding xib file, set the File owner property to my new subclass, hook up the IBOutlets.

Then, in my storyboard, I have a uiview inside of a view controller, and I set its class to the Widget class I created.

Within the widget class, I override initWithCoder, and in there load the nib as follows:

-(id)initWithCoder:(NSCoder *)aDecoder{
    if ((self = [super initWithCoder:aDecoder])){
        [self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"Widget" owner:self options:nil] objectAtIndex:0]];
    }
    return self;
}

The app would crash at this point, and setting a break point here revealed that initWithCoder was being called over and over again.

It seems like I have mixed two methods for using a nib in this situation, but I'm unclear as to where I went wrong. I can throw up a stack trace if necessary, but it's basically endless nested calls to the same function.


回答1:


Did you happen to set the View's "Custom Class" in your .xib file to "Widget"?

That would explain the behaviour you're seeing, because initWithCoder: is the initializer for all things loaded from a xib:

  1. Your parent view, which contains a Widget object, is loaded from the xib
  2. The Widget's initWithCoder: method gets called, and tries to load the Widget xib
  3. The Widget xib contains a UIView with the Custom Class "Widget", so again, a Widget object is being initialized with initWithCoder:, etc.

If that is indeed the case, all you have to do is remove the "Custom Class" entry for the UIView in your Widget's xib.




回答2:


I had same problem. My mistake was in empty File's Owner class. In File's Owner custom class must be NOT empty (Widget), and root view must be empty.

IBActions and IBOutlets were fine.



来源:https://stackoverflow.com/questions/10455521/endless-recursive-calls-to-initwithcoder-when-instantiating-xib-in-storyboard

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!