我需要有一个视图,其中将包含滑块和按钮等控件,并有一个彩色的背景。我不确定是要继承NSView还是NSViewController。我想我可以将NSView子类化,绘制自定义背景并在xib中布局控件,然后将outlets设置为NSView子类。
有些按钮需要切换,例如播放/暂停按钮,我认为这个逻辑应该在NSView中完成,当按钮切换时NSViewController会被通知,而不是NSViewController自己管理切换。
但是当我要创建一个NSView子类时,创建xib的选项是灰色的,只有使用NSViewController才能实现。那么我必须在NSViewController上有插座吗?
我想要myView.playPauseButton,但似乎我必须要有myViewController.playPauseButton
发布于 2012-10-31 02:03:33
我需要有一个视图,其中将包含滑块和按钮等控件,并有一个彩色的背景。我不确定是要继承NSView还是NSViewController。我想我可以将NSView子类化,绘制自定义背景并在xib中布局控件,然后将outlets设置为NSView子类。
如果您想使用xib,则必须使用NSViewController子类;这就是它的用途。
通常,对于您正在尝试做的事情(将几个控件捆绑在一起),NSViewController是要使用的类。
您还可以从模型-视图-控制器模式(即视图控制器和视图的来源)的角度来看这一点:视图与事物的外观有关;控制器与用户交互(以及与模型的交互)有关。
当然,您可以通过编程方式或在IB中定义NSView子类并定义其内容(将滑块和按钮作为子视图添加到子视图中),但我看不出它有什么好处,除非您打算提供一种特定的控件。
编辑:
您在注释中声明希望在NSSplitView中使用自定义的IB定义的NSView。这使得事情变得更具情境化。
现在,像往常一样,有许多设计选项,例如,您可以定义自己的MySplitController,允许您指定应从中加载拆分视图的子视图的nibs。
但是,如果我正确理解了您的目的,您想要做的是在xib中定义一个NSView,并在NSSplitView中使用它,就像它是IB允许的默认视图类型之一一样。
这是Interface Builder Plug-ins允许的。不幸的是,在Xcode4中似乎不再支持它们。
然后,我看到的唯一选择是定义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和ubiquitous的所有者(这是将视图集成到应用程序的其余部分的链接)。
正如您所看到的,我正在向instantiateWithOwner传递一个customViewOwner:这将是您的主要视图控制器或应用程序委托,负责响应来自自定义视图的所有操作,并在需要时设置其状态。这个类将是您的xib的文件所有者,因此要有一个真正的模块化设计,最好定义您在特定项目中子类的MyCustomViewController。
一旦您定义了这样一个自定义的NSView子类,那么要将它集成到您的NSSplitView中,您唯一需要做的就是将NSSplitView的subviews类设置为MyCustomView。
这不像使用IB插件那样简单,但它可以很好地集成定义在不同xib文件中的视图。
发布于 2012-10-31 01:44:22
最好用xib子类化NSViewController和init,或者在代码中手动布局你的子视图。根据我的经验,对NSView进行子类化也从来没有像我想要的那样工作,包括您正在寻找的实现。
https://stackoverflow.com/questions/13144659
复制相似问题