2012-10-30 35 views
2

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

有些按钮需要切换,如播放/暂停按钮,我想这个逻辑应该在NSView来完成,当按钮切换,而不是NSViewController有管理拨动它的自我NSViewController通知。

但是当我去创建一个NSView子类时,创建xib的选项变灰,它只能用NSViewController。所以我必须在NSViewController上有网点吗?

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

回答

-1

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

3

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

如果你想使用xib,你必须使用NSViewController子类;这就是它的目的,除其他外。

通常,对于您正在尝试做的事情(将多个控件捆绑在一起),NSViewController是要使用的类。你也可以从模型 - 视图 - 控制器模式(这是视图控制器和视图的来源)的角度看到这一点:视图与事物的显示方式有关;控制器必须处理用户交互(以及与模型的交互)。

你当然可以定义一个NSView子类,并以编程方式或在IB中定义其内容(将滑块和按钮添加为子视图),但除此之外没有多大优势,除非您打算提供一种特定的控制。

编辑:

在你想使用使用自定义评论您的状态,IB定义NSView一个NSSplitView内。这使事情变得更具情境化。

现在,像往常一样有许多设计选项,例如,您可以定义自己的MySplitController,允许您指定应从中加载拆分视图子视图的笔尖。但是,如果我正确理解你的目标,你想要做的是在xib中定义一个NSView并在NSSplitView中使用它,就像它是IB允许的默认视图类型之一一样。

这是Interface Builder Plug-ins允许的。不幸的是,它们似乎在Xcode 4中不再受到支持。

然后我看到的唯一选择是定义一个子类的NSView,例如MyCustomView然后在其initWithFrame:方法加载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; 
    } 
} 

为了简化问题,你可以有这个厦门国际银行文件只定义自定义NSView和无处不在的文件所有者(这是将视图集成到应用程序其余部分的链接)。

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

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

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

+0

所以我已经subclassed NSViewController,添加我的控件在界面生成器(在一个单独的笔尖到主窗口的xib),我如何将视图控制器的视图添加到主笔尖窗口? –

+0

在您的应用程序委托中,您实例化自定义视图控制器(并将其存储到强大的属性中),然后将'myController.view'作为子视图('addSubview:')添加到窗口中。 – sergio

+0

所以它不能在IB中完成? –