NSWindowController与NSViewController的区别

33

我来自iOS背景,正在开始学习Cocoa。在iOS上,除非我们有多个目标(iPadiPhone),否则通常只有一个窗口(one Window)并且使用UIViewControllers来管理屏幕。在这种情况下,每个新屏幕大部分时间都会映射到UIViewController

然而,在Cocoa中似乎相反,新的屏幕/窗口由NSWindow管理,其子组件由NSViewController管理。因此,如果我有多个窗口应用程序,我应该为每个窗口拥有单独的NSWindowController

这种方法正确吗,还是我有一些误解?


你在这里没有提到(但应该明确)的是,你是从iOS转而开始在MacOS上进行编程工作,对吗? - Michael Dautermann
1
在iOS方面,您有点弄反了。 UIViewController不管理UIWindow-UIWindow管理UIViewController。虽然通常一次只有一个UIViewController在屏幕上(这在iOS5中已更改为子视图控制器),但它们仍然是UIWindow的子组件。例如,UIWindow具有rootViewController属性,但viewcontroller没有window属性。现在,在OSX中,您可以拥有多个NSWindows,但它们仍然管理它们各自的NSViewControllers。简而言之,分层结构为:Window> ViewController> Views - CrimsonDiego
谢谢,是的,我来自iOS背景 :) 假设我的Mac应用程序有多个独立的窗口。采取什么最好的方法,每个窗口将映射到windowController或viewController。例如,当我们在xCode中双击文件时,它会打开一个新窗口。 - rustylepord
我不明白为什么在iOS中每个目标都需要单独的UIWindows。我使用相同的窗口适用于iPhone/iPad(它很容易自动设置到屏幕边界)。 - Nicolas Miari
即使在自动创建的 Xcode 项目中,每个目标都有两个主窗口,如果我错了,请纠正我? - rustylepord
3个回答

15

使用iPhone SDK和Leopard SDK,它们引入了视图控制器或NSViewController和UIViewController。正如它们的名称所示,它们管理视图。

视图控制器用于管理视图。当前UI设计的趋势是单窗口,多视图。这意味着有一个窗口,在其中可以交换不同组的视图以实现不同的目的。因此,视图控制器为程序员处理这些流程提供了良好的设计模式。 目前,视图控制器在iPhone和iPod touch编程中非常重要,因为该平台基于单窗口和多视图模型。然而,对于Mac来说,使用视图控制器似乎并不是很流行。 那么NSWindowController这样的窗口控制器呢?它的对应物UIWindowController在iPhone和iPod touch环境中不存在,因为这些环境只有一个窗口。 与视图控制器不同,NSWindowController用于文档型程序。文档型程序可以使用多个窗口。因此,按照苹果公司的文档,认为NSWindowController用于文档型程序是合理的。


在 iPhone 开发中,我们广泛使用 UIVIewControllers,通常一个新屏幕将由一个 UIViewController 管理。然而,在 Mac 上,可以安全地假设这是通过 NSWindowController 完成的吗?阅读苹果文档,他们似乎认为所有多窗口应用程序都属于基于文档的应用程序。因此,如果我们正在开发像 Xcode 这样的多窗口应用程序,那么它也必须是基于文档的吗?即使 IOS 有 UIWindowController,但我知道它不在发布的 API 中。 - rustylepord
你可以拥有多个窗口而不必使用基于文档的应用程序。例如,持久化面板/检查器... - Nicolas Miari

5
我也来自iOS,并且一段时间以来开始编写Mac应用程序,主要从苹果的文档中学习。我的印象是,在桌面上,你几乎不需要使用NSViewController(一个很大的例外是具有选项卡和多个视图的窗口,例如GarageBand欢迎屏幕)。
大多数情况下,每个窗口都有一个NSWindowController。首先学习NSWindowNSWindowController之间的关系(如果您正在制作基于文档的应用程序,则还需了解NSDocument)。
一旦理解正确,就可以开始尝试使用NSViewController
更新:看起来自引入storyboards后,适用于Mac应用程序的,Apple期望大部分视图呈现逻辑都应该从较旧的NSWindowController迁移到较新的NSViewController,更符合iOS应用程序的结构。我对到底在哪里划分界限或者哪种代码应该保留在窗口控制器中不是很熟悉(或者是否仍然需要对其进行子类化)。

1
到目前为止,我的印象是由于iOS上无法拥有多个窗口,所以模型是单个窗口中的多个视图控制器,尽管我们会得到使用不同屏幕的印象。在iOS上,一个屏幕由一个Viewcontroller表示。但是在Mac OSX上,由于可以拥有多个窗口,基本上每个窗口都由窗口控制器管理,我们可以包含视图控制器来管理子组件。 - rustylepord

2

一个窗口控制器创建传统的窗口并具有所有传统API。

视图控制器也可以显示在其他视图之外。它会得到一个窗口框架,但不支持完整的传统窗口控制器API。

除了自定义、模态和展示之外,视图控制器还可以以模式表和弹出方式呈现。

因此,视图控制器拥有更多的展示选项和更简化的API,但在一些传统的窗口控制器所覆盖的情况下可能存在一些限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接