Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nesting Custom Classes/XIB's with Interface Builder

I'll try to make this as short as I can.

I wrote a custom class that extends UIView with a couple of IBOutlet properties, and it has a XIB associated with it where those IBOutlets are linked to.

I then want to take that class, embed it in some other XIB (for example, a table cell), and just have it work.

It seems that when I embed that custom class in the new XIB, it does not recognize the original XIB I associated with it, so it asks for me to reset the IBOutlets to interface elements on the new XIB. This is lame.

Does anyone understand what I am trying to do and have a good approach?

like image 289
M. Ryan Avatar asked Nov 17 '09 18:11

M. Ryan


2 Answers

Here's how I managed to make this work:

In Interface Builder
Open your outer nib and do this:

  • Add a UIView to define the space where you want your inner nib to display.
  • Add a UIViewController object from the library, set its Nib Name property to the name of your inner nib file (without the extension).
  • Create IBOutlets for these two items in your outer view controller and wire them up. (I'll refer to them as innerView and innerViewController.)
  • Do not connect any of the IBOutlets defined in your inner view controller to anything in your outer nib file, just leave them unconnected.

In Xcode
In your outer view controller's viewDidLoad method, add these two lines:

[self.innerView addSubview:self.innerViewController.view];
self.innerViewController.view.frame = CGRectMake(0, 0, self.innerView.frame.size.width, self.innerView.frame.size.height);

If your outer nib is a custom UITableViewCell, put those lines in your awakeFromNib method instead.

Build & Run!

like image 93
Eric Avatar answered Sep 21 '22 01:09

Eric


I assume you're simply putting UIViews in a nib for use by a UIViewController that's purely in code. Apple calls this a detached nib file.

Follow the guide I linked to for details and example of how to get this to work.

Regarding embedding a view inside another in Interface Builder, you need to add a UIView element from the Library into the parent view, and set its class in the Inspector. Once the class of the embedded view is set, your IBOutlets should be visible.

like image 23
Ben S Avatar answered Sep 20 '22 01:09

Ben S