翻譯:iOS視圖控制器編程指南(二)——視圖控制器層級結構(The View Controller Hierarchy)

應用的視圖控制器之間的關系定義了每個視圖控制器所需要的行為。UIKit希望你以規定的方式使用視圖控制器。保持適當的視圖控制器關系可以保證自動行為交付到正確的視圖控制器。如果你違反了規定容器和展示之間的關系,你的部分應用會停止預期行為。

根視圖控制器

根視圖控制器是視圖控制器層級的錨。每個窗口都有一個根視圖控制器來填充窗口。根視圖控制器定義了用戶初始看到的內容。圖2-1展示了視圖控制器和窗口間的關系。因為窗口沒有自己的可見內容,視圖控制器的視圖提供了所有的內容。


圖2-1根視圖控制器

可以通過UIWindow對象的rootViewController屬性訪問根視圖控制器。當你使用storyboard來配置視圖控制器,UIKit在啟動時自動設置這個屬性的值。如果窗口是以編程的方式創建的,你必須自己設置根視圖控制器。

容器視圖控制器

容器視圖控制器讓你匯編復雜接口使得更好管理和重用。容器視圖控制器利用一個或多個子視圖控制器的內容與可選自定義視圖來創建最終的界面。例如,UINavigationController對象展示有導航欄和工具欄的子視圖控制器的內容,導航控制器負責管理他們,UIKit包含幾個容器視圖控制器,包括UINavigationController,UISplitViewController,和UIPageViewController

容器視圖控制器的視圖總是充滿整個空間。容器視圖控制器通常作為窗口的根視圖控制器(如圖2-2),但他們也可以以模態的方式present或者作為其他容器的孩子。容器負責定位它的子視圖。在圖中,容器并排的放置兩個子視圖。雖然這取決于容器接口,子視圖控制器幾乎不知道該容器和其他同級視圖控制器。

圖2-2容器視圖控制器作為根視圖控制器

因為容器視圖控制器管理其孩子,UIKit定義在自定義容器中如何設置這些孩子的規則。關于如何創建自定義容器視圖控制器的詳細信息,參見實現容器視圖控制器(Implementing a Container View Controller)。

Presented視圖控制器

Present一個視圖控制器通常會用新的視圖控制器來取代當前視圖控制器的內容,通常隱藏上一個視圖控制器的內容。Present方式通常用于顯示新內容。例如,present一個視圖控制器來收集用戶的輸入。也可以使用它們作為應用接口的通用組成部分。

當present一個視圖控制器,UIKit為presenting視圖控制器和presented視圖控制器間創建關系,如圖2-3所示。(Presented視圖控制器和presenting視圖控制器間還有一個反向關系。)這些關系形成視圖控制器層次的一部分,同時也是運行時查找其他視圖控制器的一種方式。

圖2-3 presented視圖控制器

當涉及到容器視圖控制器,UIKit可能修改presentation鏈來簡化必須編寫的代碼。不同的present風格在屏幕上顯示有不同的規則,例如,全屏present方式總是覆蓋整個屏幕。當你present一個視圖控制器,UIKit尋找一個為present提供合適環境的視圖控制器。在許多情況下,UIKit選擇最近的視圖控制器,但它也可能選擇窗口的根視圖控制器。在某些情況下,你可以告知UIKit哪個視圖控制器定義了present的內容并處理present。

圖2-4展示了為什么容器通常為present提供環境。當執行一個全屏present,新視圖控制器需要覆蓋整個屏幕。而不是要求孩子知道容器的bound,是否需要處理present。因為在例子中的導航控制器覆蓋整個屏幕,它present視圖控制器并開始present。


圖2-4容器及被present的視圖控制器

更多關于present的信息,參見present和transit的過程(The Presentation and Transition Process)。

官方原文地址:

https://developer.apple.com/library/prerelease/ios/featuredarticles/ViewControllerPGforiPhoneOS/TheViewControllerHierarchy.html#//apple_ref/doc/uid/TP40007457-CH33-SW1

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容