iOS视图控制器编程指南 --- 视图控制器层次结构

视图控制器的层次结构,就是一种在你的应用程序中视图控制器所定义的每个视图控制器都需要的行为之间的关系。简单点说,就是为视图控制器所添加的各种约束之间的关系。UIKit 期望你按照规定的方法来使用视图控制器,维持视图控制器之间正确的关系,确保当某些视图控制器需要的时候,视图控制器的自动化行为能够被正确的传递给相应的视图控制器。如果你违背了视图控制器规定的控制,视图之间的显示关系。那么,你的应用程序的某些部分将会停止或者出问题,具体以一种异常的方式表现出来。


根视图控制器

根视图控制器是视图控制器层次结构的核心支柱。每个窗口都有一个相应的根视图控制器,根视图控制器的内容填充对应的窗口,根视图控制器定义了最初被用户看见的内容。图2-1展示了根视图控制器和窗口之间的关系。因为窗口本身不包含可见的内容,所以视图控制器的视图提供了窗口中所有的内容。


图2-1根视图控制器

iOS视图控制器编程指南 --- 视图控制器层次结构_第1张图片

根视图控制器可以通过 UIWindow  对象的 rootViewController 属性来访问。当你使用  storyboards 来配置你的视图控制器的时候,UIKit 会在 launch 的时候自动设置根视图属性的值。如果你以编码的方式来创建窗口的话,那么你就必须自己手动设置根视图控制器了。


容器视图控制器

容器视图控制器可以让你从许多可操作可复用的部件中组装复杂的界面。容器视图控制器的内容混合了一个或者多个视图控制器加上一些可选择的自定义视图来创建了它的最终界面。例如,一个 UINavigationController 对象显示的内容就是一个子视图控制器加上一个 navigation bar 和 可选择的 toolbar ,组合起来就成为了一个 navigation controller。UIKit 包含了几个容器视图控制器,包括 UINavigationController,UISplitViewController 和 UIPageViewcontroller。

容器视图控制器的一个视图总是填充它被给定的空间,在一个窗口中,容器视图控制器经常被作为一个根视图控制器安置(如图2-2),但是它们也可被以模态的形式呈现或者是作为其它容器的children 。容器视图控制器负责合适地安置子视图的位置。在下图中,容器视图控制器边挨边的放置了两个子视图,尽管子视图依赖于容器视图控制器的interface ,但是子视图控制器对容器和其它任意的兄弟子视图只有很少的了解。

图2-2 容器作为根视图控制器

iOS视图控制器编程指南 --- 视图控制器层次结构_第2张图片

因为一个容器视图控制器管理它自己的children,所以UIKit 定义了一些规则用来告诉你在自定义的容器视图控制器中怎样建立这些children。更多关于怎样创建自定义容器视图控制器的详细信息,see  Implementing a Container View Controller.


Presented 视图控制器

呈现一个新的视图控制器来代替当前的视图控制器的内容,通常先前视图控制器的内容会被隐藏。Presentations 经常被用来模态的显示新的内容。例如,你可以呈现一个视图控制器来收集来自用户的输入,你也可以把它们作为你应用程序界面的整体构建模块。

当你呈现一个视图控制器的时候,UIKit 在presenting 视图控制器和presented 视图控制器之间创建了如图2-3的关系。(在这里也可以是一个从presented视图控制器回到它的presenting 视图控制器的相反关系。)这样的关系来自视图控制器层次结构的一部分,而且也是程序在运行时定位到其它视图控制器的一种方法。

图2-3 Presented 视图控制器

iOS视图控制器编程指南 --- 视图控制器层次结构_第3张图片

当容器视图控制器被涉及到时,UIKit 可能会修改presentation 链来简化你不得不写的代码。对于presentation应该怎样显示在屏幕上,不同的presentation styles 有不同的规则,例如,一个全屏的presentation 总是覆盖整个屏幕。当你present一个视图控制器的时候,UIKit 为这个presentation 查找一个可以提供合适的上下文环境的视图控制器。在许多事例中,UIKit 选择最靠近的容器视图控制器,但是有时候也会选择窗口的根视图控制器。在一些事例中,你也可以告诉UIKit 哪个视图控制器定义了presentation 上下文环境,应该处理该presentation。

图2-4中展示了为什么容器视图控制器通常会为一个presentation 提供上下文环境。当运行一个全屏的presentation时,新的视图控制器需要覆盖整个屏幕。容器视图控制器决定是否处理这个presentation,而不需要容器的child 知道容器的bounds。因为在下图的例子中 navigation 控制器覆盖了整个屏幕,所以navigation 控制器作为presenting 视图控制器初始化这个presentation。

图2-4 容器和一个presented 视图控制器

iOS视图控制器编程指南 --- 视图控制器层次结构_第4张图片

更多关于presentations的信息,see  The Presentation and Transition Process.

你可能感兴趣的:(iOS)