我应该使用NSViewController吗?

时间:2011-03-02 23:33:24

标签: cocoa model-view-controller core-data nsdocument

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

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

3 个答案:

答案 0 :(得分:7)

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

您可以像这样执行视图控制器方法:

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

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

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

对于您的具体案例,一个简单的方法是:

  • 使用顶级tabless和无边框标签视图,并以编程方式设置所选标签。

一般来说,你可以做很多事情:

  • 在主窗口的内容视图中手动排列子视图。
  • 根据需要在/可视区域内移动(动画)子视图。
  • 在主窗口中使用拆分视图折叠和取消折叠您想要或不想要显示的区域。
无论您是否正在创建基于文档的应用程序,或者它是基于单窗口还是基于多窗口文档的应用程序,此方法都可以使用。

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

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

但要做更复杂和手动的东西,你应该阅读文档并了解以下工作:框架/边界,翻转坐标,自动调整,以及如何覆盖自动调整以执行自己的布局。

答案 1 :(得分:0)

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

一旦摆脱标准设计,您将失去所有内置功能。<​​/ p>

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

如果您发现自己在UI中做了非标准的事情,请停下来仔细思考。仅仅因为您作为开发人员了解发生的事情并不意味着用户会这样做。

答案 2 :(得分:-2)

使用NSNavigationController管理多个视图怎么样 - 它可以轻松推送和弹出各种视图?