2

我需要一个包含滑块和按钮等控件的视图,并具有彩色背景。我不确定是子类NSView还是NSViewController. 我以为我可以子类NSView化并绘制自定义背景并在 xib 中布局控件,并将出口设置为NSView子类。

有些按钮需要切换,例如播放/暂停按钮,我认为这个逻辑应该在 中完成NSView,并NSViewController在按钮切换时得到通知,而不是NSViewController必须自己管理切换。

但是当我去创建一个NSView子类时,创建 a 的选项xib是灰色的,只有NSViewController. 所以我必须在上面有插座NSViewController吗?

我想要myView.playPauseButton,但似乎我必须拥有myViewController.playPauseButton

4

2 回答 2

3

我需要一个包含滑块和按钮等控件的视图,并具有彩色背景。我不确定是继承 NSView 还是 NSViewController。我想我可以继承一个 NSView 并绘制一个自定义背景并在 xib 中布局控件,并将出口设置为 NSView 子类。

如果要使用xib,则必须使用NSViewController子类;这就是它的用途,除其他外。

一般来说,对于您想要做的事情(将几个控件捆绑在一起),NSViewController是要使用的类。

你也可以从 Model-View-Controller 模式(即视图控制器和视图的来源)的角度来看这一点:视图与事物的外观有关;控制器与用户交互(以及与模型的交互)有关。

您当然可以NSView通过编程方式或在 IB 中定义一个子类并定义其内容(将滑块和按钮作为子视图添加到其中),但我认为它没有多大优势,除非您要提供一种特定的控制。

编辑:

您在评论中声明您希望使用自定义的 IB 定义NSViewNSSplitView. 这使事情更加情境化。

现在,像往常一样,有许多设计选项,例如,您可以定义自己的选项,MySplitController允许您指定应该从中加载拆分视图的子视图的 nib。

但是,如果我正确理解您的目标,您想做的是在 xib 中定义一个 NSView 并在 NSSplitView 中使用它,就像它是 IB 允许的默认视图类型之一一样。

Interface Builder Plug-ins允许这样做。不幸的是,Xcode 4 似乎不再支持它们。

然后我看到的唯一选择是定义一个子类NSView,例如,MyCustomView然后在其initWithFrame:方法中加载 xib 文件,识别您在其中定义的视图,并将其添加为子视图。

具体来说,您可以使用此代码加载 xib 文件顶级对象,其中将找到您的自定义视图:

NSNib *nib = [[[NSNib alloc] initWithNibNamed:@"MyView" bundle:nil] autorelease];
NSArray *topLevelObjects;
if (![nib instantiateWithOwner:customViewOwner topLevelObjects:&topLevelObjects]) {
    //- handle error
}

MyView *myView = nil;
for (id topLevelObject in topLevelObjects) {
  if ([topLevelObject isKindOfClass:[MyView class]) {
    myView = topLevelObject;
    break;
  }
}

为了简化事情,您可以让这个 xib 文件只定义您的自定义 NSView 和无处不在的文件所有者(这是将视图集成到应用程序其余部分的链接)。

如您所见,我正在传递一个customViewOwnerto instantiateWithOwner:这将是您的主视图控制器或应用程序委托,负责响应来自自定义视图的所有操作并在需要时设置其状态。此类将是您的 xib 的文件所有者,因此要进行真正的模块化设计,最好MyCustomViewController在特定项目中定义您的子类。

一旦你定义了这样一个自定义的 NSView 子类,那么将它集成到你的 NSSplitView 中唯一需要做的就是将 NSSplitView 的子视图类设置为MyCustomView.

这不像使用 IB 插件那么简单,但它可以很好地用于集成在不同 xib 文件中定义的视图。

于 2012-10-30T18:03:33.080 回答
-1

最好将 NSViewController 子类化并使用 xib 初始化或在代码中手动布局子视图。根据我的经验,子类化 NSView 从来没有按照我想要的方式进行,包括您正在寻找的实现。

于 2012-10-30T17:44:21.883 回答