我希望我的应用程序有一个文档,但有多个屏幕,而不需要使用多个窗口。实现这一目标的最佳方法是什么?我正在考虑使用单个 NSPersistentDocument,该文档将从显示一组控件的 NSViewController 开始,然后将该视图交换为另一个 NSViewController。
我的问题是:这是正确使用 NSViewControllers 吗?甚至可以做到吗?如果两者的答案都是肯定的,我如何在文档中将视图交换为另一个视图?
我希望我的应用程序有一个文档,但有多个屏幕,而不需要使用多个窗口。实现这一目标的最佳方法是什么?我正在考虑使用单个 NSPersistentDocument,该文档将从显示一组控件的 NSViewController 开始,然后将该视图交换为另一个 NSViewController。
我的问题是:这是正确使用 NSViewControllers 吗?甚至可以做到吗?如果两者的答案都是肯定的,我如何在文档中将视图交换为另一个视图?
是的,这是完全可以做到的。是的,您应该使用视图控制器,但您不必这样做。这严格来说是一种风格选择。如果您不使用视图控制器,那么所有控制器逻辑可能都在您的单个窗口控制器中。对于大型应用程序来说,这可能会很痛苦。视图控制器可帮助您将 UI 分解为逻辑组件和控制单元。
您将像这样执行视图控制器方法:
现在您已经获得了具有多个顶级视图控制器的应用程序的基本框架。从这里开始,任务是根据您的需要或用户输入的指示在主窗口中排列视图。有时您可能有 3-4 个顶级视图,有时 1 个,在您的情况下,您只想将一个换成另一个。这些场景之间没有太大的区别。
有很多方法可以实现这一目标。
对于您的具体情况,一个简单的方法是:
一般来说,你可以做很多事情:
顺便说一句,无论您是否创建基于文档的应用程序,或者它是基于单窗口或多窗口文档的应用程序,此方法都有效。
使用视图控制器的一个缺点是许多顶级视图布局和管理必须以编程方式完成,而不是在 IB 中。但这并不难。
通常你只需要做一个 addSubview: 和 setFrame:, 将你的视图放置在你已经在 IB 中布局的父视图中。
但是要做更复杂和手动的事情,您应该阅读文档并了解以下工作原理:框架/边界、翻转坐标、自动调整大小以及如何覆盖自动调整大小以进行自己的布局。
可以按照您的描述完成,但您必须手动管理与文档的关系,因为为简单起见,默认配置假定一个文档 --> 一个控制器关系。
一旦脱离标准设计,您将失去所有内置功能。
您可能需要重新考虑您的设计。将文档链接到特定视图控制器的目的是为用户提供文档的隐喻。就用户而言,视图是文档。如果您提供同一文档的多个视图,则用户最有可能解释具有多个文档的内容,因为这是 UI 语法训练他们所期望的。
当你发现自己在 UI 中做一些非标准的事情时,停下来仔细想想。仅仅因为您作为开发人员了解正在发生的事情并不意味着用户会。
使用 NSNavigationController 管理多个视图怎么样?它可以很容易地推送和弹出各种视图?