0

I have been loading view from Nib files successfully using the approach found on this site

[[NSBundle mainBundle] loadNibNamed:@"YourNibName" owner:self options:nil];

The problem is that, because we have to set the File Owner, this nib file becomes "attached" to this view controller. This view is subclass of UITableViewCell and I wanted to load this nib file from several different vc's. Thanks for your help.

3 Answers 3

2

A nib is just a template, you can load it over and over again.

If using iOS4, you might want do look at UINib which gives improved performance for repeated nib loading.

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

Comments

0

I'll present two options:

  • Create a class NibLoader with a single @property (nonatomic, retain) IBOutlet id mainObject; and a method called loadNibNamed:bundle:). Then, do MyView * v = [[NibLoader loadNibNamed:"MyView" bundle:nil] mainObject];. (A GCC 4.0 property access bug meant that [...].mainObject would call [...] twice; it's been fixed in 4.2.)
  • Create @protocol MyNibOwner which has @property (nonatomic, retain) IBOutlet MyView * myView;, and change the file's owner class to id<MyNibLoader> or NSObject<MyNibLoader>.

5 Comments

or UIViewController<MyNibLoader>, but that stops views from loading your nib as a subview in init.
The second solution sounds perfect, but IB does not accept the protocol after id. Setting it to id and keeping the "broken" reference worked but I suppose its not very safe.
That's odd, since IBOutlet id<FooDelegate> delegate works perfectly fine (but perhaps it just ignores the protocol in that case; it wouldn't surprise me). You could add a dummy @interface MyNibOwnerHack:NSObject<MyNibOwner> for InterfaceBuilder's benefit.
shameless plug: I have just posted a nice addition to this method that proved very helpful to me on loudcoding.com/posts/…
@PauloCasaretto: You probably don't want to do [self viewWithTag:0], since IIRC 0 is the default tag. You also need to be slightly careful when reusing tag IDs.
-1

Pedantically, a nib should probably have a single controller. What I would probably do is create a new UIViewController subclass that controls the stuff in this nib of yours, and then whenever you want the stuff in the nib, create one of these view controllers and ask it for the stuff, instead of loading the nib directly.

1 Comment

Ugh, no. Embedding view controllers in view controllers is icky, and if you just want the view, you need to do UIView * v = [[vc.view retain] autorelease]; vc.view = nil; return v; or things would behave strangely (I forgot what the bug is or which OS version).

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.