在Interface Builder中设计一个NSView子类,然后实例化它?

toa*_*tie 2 cocoa objective-c

所以我有一个NSTabView,我正在动态调整和填充NSView子类.我想在IB中设计页面然后实例化它们并将它们添加到NSTabView.我得到了程序化添加NSView子类,但我不知道如何在IB中设计它们然后实例化它们.

toa*_*tie 8

我想我明白了.如果这不是一件好事,请告诉我.

我创建了一个新的xib文件,将其File的Owner设置为NSViewController并将其"view"设置为我在xib中设计的自定义视图.

那么你只需要:

NSViewController *viewController = [[NSViewController alloc] initWithNibName:@"MyViewXib" bundle:nil];
NSView *myView = [viewController view];
Run Code Online (Sandbox Code Playgroud)


Dav*_*ong 6

@toastie有一个非常好的答案.我的情况类似,但需要更多解释.

假设你已经有了一个控制器对象而你不想实例化一个新的控制器对象只是为了得到一个视图,让我们说你需要这个视图的多个副本(例如,你'我在IB中设计了一个自定义UITableViewCell,你想要从你的UITableViewController一次又一次地实例化它.这是你如何做到这一点:

  1. 将新的IBOutlet添加到名为"specialView"的现有类(或类似的东西)中.将其声明为(非原子,保留)属性也可能有所帮助.
  2. 创建一个名为"SpecialView"的新视图xib,然后根据需要构建视图.
  3. 将视图的文件所有者设置为控制器对象.
  4. 将File的Owner的specialView出口设置为新视图.
  5. 只要您在代码中需要视图的新副本,就可以执行以下操作.

(无偿文本以使格式正常工作)

NSNib * viewNib = [[NSNib alloc] initWithNibNamed:@"SpecialView" bundle:nil];
[viewNib instantiateNibWithOwner:self topLevelObjects:nil];
[viewNib release];
NSView * myInstantiatedSpecialView = [[[self specialView] retain] autorelease];
[self setSpecialView:nil];
Run Code Online (Sandbox Code Playgroud)

是的,它比其他方式更多的代码,但我更喜欢这种方法,因为视图显示在指定的IBOutlet中.我保留并自动释放视图,因为我希望在有视图后将插座重置为nil,因此可以立即准备加载视图的新副本.我还要指出iPhone上的代码更短,这需要一行加载视图,而不是3(就像在Mac上一样).这条线很简单:

[[NSBundle mainBundle] loadNibNamed:@"SpecialView" owner:self options:nil];
Run Code Online (Sandbox Code Playgroud)

HTH!