[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 根視圖控制器

根視圖控制器可以從 UIWindow 對象的 rootViewController 屬性訪問。 當您使用 storyboard 來配置視圖控制器時,UIKit會在啟動時自動設置該屬性的值。 對于以編程方式創建的窗口,您必須自己設置根視圖控制器。
### 容器視圖控制器
容器視圖控制器可以使用便于管理和可重用的部分來組合復雜的界面。 容器視圖控制器將一個或多個子視圖控制器的內容與可選的自定義視圖混合在一起,以創建其最終界面。例如,UINavigationController 對象顯示來自子視圖控制器的內容以及由導航控制器管理的導航欄和可選工具欄。 UIKit包含多個容器視圖控制器,包括 UINavigationController, UISplitViewController 和 UIPageViewController 。
###### 圖 2-2 充當根視圖控制器的容器

由于容器視圖控制器管理其子項,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 顯示的視圖控制器

當涉及到容器視圖控制器時,UIKit 可能會修改表示鏈,以簡化您必須編寫的代碼。不同的展示樣式對于它們在屏幕上的顯示方式有不同的規則,例如,全屏顯示總是覆蓋整個屏幕。當您呈現一個視圖控制器時,UIKit 尋找一個視圖控制器,它為展示提供了一個適當的上下文。在許多情況下,UIKit 選擇最近的容器視圖控制器,但它也可以選擇窗口的根視圖控制器。在某些情況下,你還可以告訴 UIKit 哪個視圖控制器定義了表示上下文并應該處理這個展示。
圖2-4說明了為什么容器通常為展示提供上下文。當執行全屏顯示時,新的視圖控制器需要覆蓋整個屏幕。容器不需要讓子視圖知道容器的邊界,而是決定是否處理這個表示。由于示例中的導航控制器覆蓋整個屏幕,它充當 presenting view controller 并啟動展示效果。
###### 圖 2-4 一個容器和一個 presented view controller

有關 presentations 的信息,請參閱 [The Presentation and Transition Process](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PresentingaViewController.html#//apple_ref/doc/uid/TP40007457-CH14-SW7) 。