首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子类NSViewController或NSView

子类NSViewController或NSView
EN

Stack Overflow用户
提问于 2012-10-31 01:39:33
回答 2查看 2.2K关注 0票数 2

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

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

但是当我要创建一个NSView子类时,创建xib的选项是灰色的,只有使用NSViewController才能实现。那么我必须在NSViewController上有插座吗?

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

EN

回答 2

Stack Overflow用户

发布于 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文件的顶级对象,您可以在其中找到您的自定义视图:

代码语言:javascript
复制
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文件中的视图。

票数 3
EN

Stack Overflow用户

发布于 2012-10-31 01:44:22

最好用xib子类化NSViewController和init,或者在代码中手动布局你的子视图。根据我的经验,对NSView进行子类化也从来没有像我想要的那样工作,包括您正在寻找的实现。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13144659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档