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

Posted

技术标签:

【中文标题】如何在 Cocoa 应用程序中切换视图?【英文标题】:How do I switch out Views in a Cocoa application? 【发布时间】:2010-07-17 18:08:34 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

需要注意的两件事:

    旧视图,在本例中为titleView,由该调用释放。如果您希望它仍然可用,则必须在更换之前retain 它。 如果您的页面尺寸不同,父视图将不会调整大小。更改窗口的框架大小,因此 contentView 很容易,但您可以添加一点核心动画来给它一些风格。

我希望这会有所帮助!

【讨论】:

好的,谢谢!我也会调查一下。你们真的很有帮助。【参考方案2】:

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

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

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

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

【讨论】:

我想这更有意义。你认为我必须使用initWithNibName:bundle: 来加载视图还是我可以将视图的“文件所有者”设置为 ViewController? 两者都需要。您使用 -initWithNibName:bundle: 来实例化您的 NSViewController 子类。加载指定的 nib 文件并充当其文件的所有者;将 nib 的 File's Owner 的类设置为您的 NSViewController 子类,并将 File's Owner 的“视图”出口指向您的视图。【参考方案3】:

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

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

【讨论】:

桌面(NSView)中的相同界面 所以我想知道为什么要使用NSViewController。我是不是该?我应该使用 NSView 和 NSViewController 变量创建 NSWindowController 的子类吗?我不确定制作具有可切换视图的窗口真正需要什么。据我了解,我根本不需要 NSViewController 但我不知道,因为 Apple 的示例使用了它,它应该让你更轻松。 您可以在 ViewController 中进行视图替换决定。 Apple 文档:“应用程序通过使用视图控制器对象呈现一组新视图来更改该窗口的内容。”【参考方案4】:

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

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

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

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

【讨论】:

以上是关于如何在 Cocoa 应用程序中切换视图?的主要内容,如果未能解决你的问题,请参考以下文章

导致 CPU 使用率高的 Cocoa 约束

如何在 Cocoa 中禁用 Macbook Pro 切换到高性能显卡?

Cocoa:如何让表格视图在每个单元格中绘制自定义视图

如何使 Cocoa Touch 框架在应用程序中保持最新

跨 Cocoa 应用程序共享数据

带有菜单栏但没有 Dock 图标/切换菜单的 Cocoa 应用程序