如何在Cocoa应用程序中切换视图?

时间:2010-07-17 18:08:35

标签: objective-c cocoa macos nsviewcontroller

所以我开始学习如何使用Cocoa。我想我已经得到了它,但我已经挂断了创建和切换视图。我正在改写我之前做过的练习游戏。我想要的只是一个窗口(最好不能调整大小),我希望能够在游戏中切换不同屏幕的视图。

首先,我有主菜单(开始游戏,高分,退出)。然后我需要一个窗口为每个屏幕(游戏屏幕,高分屏幕)。

我对此感到困惑的是如何设计它。我查找了NSViewController,认为它管理视图,但事实并非如此。它只通过加载它来管理一个视图。我不明白为什么我需要使用NSViewController。难道我不能只有一个包含多个NSView子类的窗口类并加载它们吗?我不确定我是否理解ViewController的目的。

我的Window类是否真的需要子类化NSWindowController?我试图按照Apple的ViewController示例的例子,它有一个窗口控制器类,它是NSWindowController的子类。我没有看到子类化的目的是什么。所有NSWindowController似乎都添加了- initWithPath:(NSString *)newPath,但是当我可以编辑plist文件以在启动时打开窗口时,我无法看到它的用途。 Apple的例子还有一个NSView变量和一个NSViewController变量。您是否只需要一个变量来存储当前视图?

先谢谢你们,我真的很困惑这是怎么回事。

4 个答案:

答案 0 :(得分:6)

听起来你正试图在窗口中换掉内容视图?如果是这种情况,您可以使用-[NSView replaceSubview:with:] -[NSWindow contentView]作为接收方。

假设您有一个名为titleView的标题页和一个名为menuView的菜单页,您想要将它们交换进应用程序的主窗口。如果标题页可见并且用户点击“主菜单”按钮或链接,您可以在按钮的委托方法中输入类似的内容:

[[[NSApp mainWindow] contentView] replaceSubview:titleView with:menuView];

要注意两件事:

  1. 此视图会释放旧视图{@ 1}}。如果您希望它仍然可用,则必须在更换之前titleView
  2. 如果您的网页尺寸不同,则父视图不会调整大小。更改窗口的框架大小,因此retain很容易,但您可以在混合中添加一些核心动画,以赋予它一些风格。
  3. 我希望这有帮助!

答案 1 :(得分:5)

您使用NSWindowControllerNSViewController来管理窗口或视图,因为您只需要为窗口的新“种类”创建NSWindowNSView的子类或查看。例如,如果要使用圆形窗口,则可以继承NSWindow。如果您只想在窗口中拥有控件,则继承NSWindowController

NSViewController相同:通常,NSViewController's视图将属于某些基类,例如NSView(或者您自己的NSView子类,它们会绘制自定义背景)。 NSViewController管理该视图的子视图之间的交互,使其在较大的应用程序中充当单个单元。

以这种方式思考:视图绘制,并将原始输入事件转换为更高级别的操作。控制器向视图提供信息并处理操作。

通过这种方式进行组合可以极大地提高代码的模块性,使其更易于设计,编写和调试。

答案 2 :(得分:1)

使用UIVew中定义的以下功能(它是现有窗口的一部分)

- (void)addSubview:(UIView *)view
- (void)removeFromSuperview

答案 3 :(得分:0)

我是cocoa的新手,但我认为你的应用并不需要NSViewController。 NSViewController在MVC设计模式中扮演“Controller”的角色。因此它在一个视图中“控制”所有动作 - 胶合逻辑。

例如,在具有多个控件的视图中:按钮,表格,复选框:,文本字段日期选择器等,可能需要绑定和更新的控件之间的详细交互。例如,按钮单击会加载数据库提取,并进行错误处理和验证。胶合逻辑进入NSViewController类。

在您的应用中,听起来每个视图都是一个简单的页面,几乎不需要视图级别控制。因此,您可能需要一个NSWindowController,一个控制器来处理从页面到页面转换的逻辑和事件。

处理填充单个窗口的多个视图的一种技术是使用NSTabView并在IB中将选项卡样式设置为“无边框”。然后使用按钮操作选择所需的NSTabViewItem。在开发过程中,将tabview样式设置为“顶部选项卡”,IB允许您通过要显示的子视图进行选项卡。