views:

509

answers:

2

So I have an NSTabView that I'm dynamically resizing and populating with NSView subclasses. I would like to design the pages in IB and then instantiate them and add them to the NSTabView. I got the programmatic adding of NSView subclasses down, but I'm not sure how to design them in IB and then instantiate them.

+4  A: 

I think I got it. Let me know if this is not a good thing to do.

I made a new xib file, set its File's Owner to be an NSViewController and set its "view" to the custom view i designed in the xib.

Then in the code it's just:

    NSViewController *viewController = [[NSViewController alloc] initWithNibName:@"MyViewXib" bundle:nil];
NSView *myView = [viewController view];
toastie
I think you're getting close. But I don't think you should be setting the FirstResponder to be the NSViewController, you should set the Files Owner to be a NSViewController (and link up the view controller's view IBOutlet).
Reed Olsen
Oops, that's what I meant actually, it was the File's Owner. I'll fix it in the answer so it doesn't confuse people.
toastie
A: 

@toastie had a really good answer. Mine is similar, but requires a bit more explanation.

Let's say you've already got a controller object and you don't want to instantiate a new controller object just to get at a view, and let's say that you're going to need multiple copies of this view (for example, you've designed a custom UITableViewCell in IB and you want to instantiate it again and again from your UITableViewController). Here's how you would do that:

  1. Add a new IBOutlet to your existing class called "specialView" (or something like that). It may also be helpful to declare it as a (nonatomic, retain) property.
  2. Create a new view xib called "SpecialView", and build the view however you like.
  3. Set the File's Owner of the view to be your controller object.
  4. Set the specialView outlet of File's Owner to be the new view.
  5. Whenever you need a new copy of the view in your code, you can simply do the following.

(gratuitous text to get formatting working properly)

NSNib * viewNib = [[NSNib alloc] initWithNibNamed:@"SpecialView" bundle:nil];
[viewNib instantiateNibWithOwner:self topLevelObjects:nil];
[viewNib release];
NSView * myInstantiatedSpecialView = [[[self specialView] retain] autorelease];
[self setSpecialView:nil];

Yes, it's a bit more code than other ways, but I prefer this method simply because the view shows up in the designated IBOutlet. I retain and autorelease the view, because I like to reset the outlet to nil once I have the view, so it can be immediately ready to load a new copy of the view. I'll also point out that the code for this is even shorter on the iPhone, which requires one line to load the view, and not 3 (as it does on the Mac). That line is simply:

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

HTH!

Dave DeLong