我应该为此使用 NSViewController 吗?

Posted

技术标签:

【中文标题】我应该为此使用 NSViewController 吗?【英文标题】:Should I use an NSViewController for this? 【发布时间】:2011-03-02 23:33:24 【问题描述】:

我希望我的应用程序有一个文档,但有多个屏幕,而不需要使用多个窗口。实现这一目标的最佳方法是什么?我正在考虑使用单个 NSPersistentDocument,它将从显示一组控件的 NSViewController 开始,然后将该视图交换为另一个 NSViewController。

我的问题是:这是正确使用 NSViewControllers 吗?甚至可以做到吗?如果两者的答案都是肯定的,我如何在文档中将视图交换为另一个视图?

【问题讨论】:

【参考方案1】:

是的,这是完全可以做到的。是的,您应该使用视图控制器,但您不必这样做。这严格来说是一种风格选择。如果您不使用视图控制器,那么所有控制器逻辑可能都在您的单个窗口控制器中。对于大型应用程序来说,这可能会很痛苦。视图控制器可帮助您将 UI 分解为逻辑组件和控制单元。

你会像这样执行视图控制器方法:

为每个组件视图创建单独的 xib。 为每个 xib 创建一个视图控制器子类来加载、拥有和控制它。 您可以更进一步,为视图中的不同区域设置子视图控制器。 在窗口控制器的 awakeFromNib 类中,实例化所有***视图控制器。

现在您已经获得了具有多个***视图控制器的应用程序的基本框架。从这里开始,任务是根据您的需要或用户输入的指示在主窗口中排列视图。有时您可能有 3-4 个***视图,有时 1 个,在您的情况下,您只想将一个换成另一个。这些场景之间没有太大区别。

有很多方法可以实现这一点。

对于您的具体情况,一个简单的方法是:

使用***表格和无边框选项卡视图并以编程方式设置所选选项卡。

通常你可以做很多事情:

在主窗口的内容视图中手动排列子视图。 根据需要将子视图移入/移出或移入/移出可视区域。 使用主窗口中的拆分视图折叠和取消折叠您想要或不想显示的区域。

顺便说一句,无论您是否正在创建基于文档的应用程序,或者它是基于单窗口或多窗口文档的应用程序,此方法都有效。

使用视图控制器的一个缺点是许多***视图布局和管理必须以编程方式完成,而不是在 IB 中。但这并不难。

通常您只需要执行 addSubview: 和 setFrame:, 即可将您的视图放置在您已经在 IB 中布局的父视图中。

但要执行更复杂的手动操作,您应该阅读文档并了解以下工作原理:框架/边界、翻转坐标、自动调整大小以及如何覆盖自动调整大小以进行自己的布局。

Introduction to View Programming Guide for Cocoa

【讨论】:

作为参考,这是我想做的一个例子:developer.apple.com/library/mac/#samplecode/ViewController/…【参考方案2】:

可以按照您的描述完成,但您必须手动管理与文档的关系,因为为简单起见,默认配置假定一个文档 --> 一个控制器关系。

一旦脱离标准设计,您将失去所有内置功能。

您可能需要重新考虑您的设计。将文档链接到特定视图控制器的目的是为用户提供文档的隐喻。就用户而言,视图文档。如果您提供同一文档的多个视图,则用户最有可能解释具有多个文档的内容,因为这是 UI 语法训练他们所期望的。

当您发现自己在 UI 中做一些非标准的事情时,请停下来仔细考虑一下。仅仅因为您作为开发人员了解正在发生的事情并不意味着用户会。

【讨论】:

【参考方案3】:

如何使用 NSNavigationController 来管理多个视图 - 它可以轻松推送和弹出各种视图?

【讨论】:

你是说 UINavigationController?我不是为 ios 开发的。

以上是关于我应该为此使用 NSViewController 吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSViewController 加载 nib 后...如何访问 nib 中的 NSButton?

从 NSTableView 获取数据到 NSViewController

Cocoa:NSViewController 视图中的设置器

如何使用 NSViewController 识别 modalForWindow

在 NSWindow 中呈现不同 NSViewController 的正确方法

使用 NSViewController 在 osx 上切换视图控制器