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

时间:2009-07-03 04:55:10

标签: objective-c cocoa

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

2 个答案:

答案 0 :(得分:8)

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

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

然后你需要:

NSViewController *viewController = [[NSViewController alloc] initWithNibName:@"MyViewXib" bundle:nil];
NSView *myView = [viewController view];

答案 1 :(得分:6)

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

假设您已经拥有了一个控制器对象,并且您不想实例化一个新的控制器对象只是为了获取视图,并且假设您需要此视图的多个副本(例如,你已经在IB中设计了一个自定义UITableViewCell,你想要从你的UITableViewController一次又一次地实例化它。以下是您将如何做到这一点:

  1. 将新的IBOutlet添加到名为“specialView”的现有类(或类似的东西)中。将它声明为(非原子,保留)属性也可能有所帮助。
  2. 创建一个名为“SpecialView”的新视图xib,然后根据需要构建视图。
  3. 将视图的文件所有者设置为控制器对象。
  4. 将文件所有者的specialView插座设置为新视图。
  5. 只要您在代码中需要视图的新副本,就可以执行以下操作。
  6. (免费文本以使格式化正常工作)

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

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

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

    HTH!