ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC=5] * * * * * >原文链接 :[The View Controller Hierarchy](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/TheViewControllerHierarchy.html#//apple_ref/doc/uid/TP40007457-CH33-SW1) 应用程序的视图控制器之间的关系定义了每个视图控制器所需的实现的功能。 UIKit 希望能以规定的方式使用视图控制器。维护正确的视图控制器关系,确保在需要时将自动行为发送到正确的视图控制器。如果你打破了规定的容器和展示的关系,应用程序将停止按预期的方式运行。 ### 根视图控制器 根视图控制器是视图控制器层次结构的锚点。 每个窗口只有一个根视图控制器,其内容填充该窗口。 根视图控制器定义了用户看到的初始内容。 图2-1显示了根视图控制器和窗口之间的关系。 因为窗口本身没有可见的内容,所以视图控制器的视图提供了所有的内容。 ###### 图 2-1 根视图控制器 ![](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/Art/VCPG-root-view-controller_2-1_2x.png) 根视图控制器可以从 UIWindow 对象的 rootViewController 属性访问。 当您使用 storyboard 来配置视图控制器时,UIKit会在启动时自动设置该属性的值。 对于以编程方式创建的窗口,您必须自己设置根视图控制器。 ### 容器视图控制器 容器视图控制器可以使用便于管理和可重用的部分来组合复杂的界面。 容器视图控制器将一个或多个子视图控制器的内容与可选的自定义视图混合在一起,以创建其最终界面。例如,UINavigationController 对象显示来自子视图控制器的内容以及由导航控制器管理的导航栏和可选工具栏。 UIKit包含多个容器视图控制器,包括 UINavigationController, UISplitViewController 和 UIPageViewController 。 ###### 图 2-2 充当根视图控制器的容器 ![](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/Art/VCPG-container-acting-as-root-view-controller_2-2_2x.png) 由于容器视图控制器管理其子项,UIKit定义了如何在自定义容器中设置这些子项的规则。 有关如何创建自定义容器视图控制器的详细信息,请参阅 [Implementing a Container View Controller](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html#//apple_ref/doc/uid/TP40007457-CH11-SW1) 。 ### 呈现视图控制器 用一个新的视图控制器来替换当前视图控制器的内容,通常会隐藏以前的视图控制器的内容。Presentations 通常用于显示新内容的模式。例如,您可能会提供一个视图控制器来从用户那里收集输入。你还可以将它们用作应用程序的一个普通界面。 当您呈现一个视图控制器时,UIKit 在 presenting view controller 和 presented view controller 之间创建一个关系,如图2-3所示。(从 presented view controller 返回到它的presenting view controller,也有一种反向关系。)这些关系是视图控制器层次结构的一部分,是在运行时定位其他视图控制器的一种方法。 ###### 图 2-3 显示的视图控制器 ![](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/Art/VCPG-presented-view-controllers_2-3_2x.png) 当涉及到容器视图控制器时,UIKit 可能会修改表示链,以简化您必须编写的代码。不同的展示样式对于它们在屏幕上的显示方式有不同的规则,例如,全屏显示总是覆盖整个屏幕。当您呈现一个视图控制器时,UIKit 寻找一个视图控制器,它为展示提供了一个适当的上下文。在许多情况下,UIKit 选择最近的容器视图控制器,但它也可以选择窗口的根视图控制器。在某些情况下,你还可以告诉 UIKit 哪个视图控制器定义了表示上下文并应该处理这个展示。 图2-4说明了为什么容器通常为展示提供上下文。当执行全屏显示时,新的视图控制器需要覆盖整个屏幕。容器不需要让子视图知道容器的边界,而是决定是否处理这个表示。由于示例中的导航控制器覆盖整个屏幕,它充当 presenting view controller 并启动展示效果。 ###### 图 2-4 一个容器和一个 presented view controller ![](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/Art/VCPG-container-and-presented-view-controller_2-4_2x.png) 有关 presentations 的信息,请参阅 [The Presentation and Transition Process](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PresentingaViewController.html#//apple_ref/doc/uid/TP40007457-CH14-SW7) 。