8

所以我开始学习如何使用 Cocoa。我想我已经明白了,但我对创建和切换视图很感兴趣。我正在重写我之前制作的游戏以进行练习。我想要的只是一个窗口(最好不能调整大小),并且我希望能够在游戏中切换不同屏幕的视图。

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

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

我的窗口类真的需要继承 NSWindowController 吗?我试图遵循 Apple 的 ViewController 示例的示例,它有一个窗口控制器类,它是 NSWindowController 的子类。我不明白继承它的目的是什么。所有 NSWindowController 似乎都添加了,- initWithPath:(NSString *)newPath但是当我可以编辑 plist 文件以在启动时打开窗口时,我看不到它的用途。Apple 的示例也有一个 NSView 变量和一个 NSViewController 变量。你不是只需要一个变量来存储当前视图吗?

在此先感谢各位,我真的很困惑这是如何工作的。

4

4 回答 4

6

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

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

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

有两点需要注意:

  1. 在这种情况下,旧视图titleView通过此调用释放。如果您希望它仍然可用,则必须retain在更换它之前使用它。
  2. 如果您的页面具有不同的尺寸,父视图将不会调整大小。更改窗口的框架大小,因此contentView很容易,但您可以添加一点核心动画来给它一些风格。

我希望这有帮助!

于 2010-07-18T11:43:49.577 回答
5

您使用NSWindowControllerNSViewController管理窗口或视图是因为您应该只需要创建窗口或视图的新“种类”的子类NSWindowNSView为新的“种类”创建子类。例如,如果你想使用一个圆形窗口,你可以继承NSWindow. 如果您只想在窗口中拥有控件,您可以将NSWindowController.

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

可以这样想:视图绘制,它们将原始输入事件转换为更高级别的操作。控制器向视图提供信息并处理操作。

以这种方式组合事物可以极大地提高代码的模块化,使其更易于设计、编写和调试。

于 2010-07-17T19:54:46.853 回答
1

使用 UIVew 中定义的以下函数(这是现有窗口的一部分)

- (void)addSubview:(UIView *)view
- (void)removeFromSuperview
于 2010-07-17T18:34:02.257 回答
0

我是 cocoa 的新手,但我认为您的应用程序并不需要 NSViewController。NSViewController 在 MVC 设计模式中扮演“控制器”的角色。所以它在一个视图中“控制”所有的动作——粘合逻辑。

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

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

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

于 2013-10-31T15:51:43.743 回答