6

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.

2 Answers 2

19

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.

Sign up to request clarification or add additional context in comments.

5 Comments

but if you remove the Custom Class value it's not possible to use its IBOutlets and IBActions...
@nano Of course you can use a custom class for your view; you just need to prevent recursion.
whats the best way to prevent recursion without removing "Custom Class" from xib?
@Jaro Just create an instance of your view with [[NSBundle mainBundle] loadNibNamed:@"YourNibFileNameWithoutSuffix" owner:self options:nil]. This will create the UIView instance you need. The only thing you can't do is create an instance of your view class programmatically and then try to load its own nib in initWithCoder: (because that leads to another instance of your view class being created and so on).
@Andreas: it was my fault, I have set "Custom class" to the main "view" instead of the Parent View Controller. Here we go recursion :) lesson learned..
3

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.