ViewController編程指南概述-視圖控制器層次結構

應用程序視圖控制器之間的關系定義了每個視圖控制器所需的行為。 UIKit希望你以規定的方式使用視圖控制器。 維護適當的視圖控制器關系可確保在需要時將自動行為傳遞到正確的視圖控制器。 如果你違反規定的遏制和演示關系,你應用的某些部分將停止按預期行為。

根視圖控制器

根視圖控制器是視圖控制器層次結構的錨點。 每個窗口只有一個根視圖控制器,其內容填充該窗口。根視圖控制器定義用戶看到的初始內容。 圖2-1顯示了根視圖控制器和窗口之間的關系。 因為窗口沒有自己的可見內容,所以視圖控制器的視圖提供了所有的內容。

圖2-1 根視圖控制器

VCPG-root-view-controller_2-1_2x.png

可以從UIWindow對象的rootViewController屬性訪問根視圖控制器。 當你使用故事板配置視圖控制器時,UIKit會在啟動時自動設置該屬性的值。 對于以編程方式創建的窗口,必須自己設置根視圖控制器。

容器視圖控制器

容器視圖控制器允許你從更易于管理和可重復使用的部分組裝復雜的接口。 容器視圖控制器將一個或多個子視圖控制器的內容與可選的自定義視圖相混合以創建其最終界面。 例如,UINavigationController對象顯示來自子視圖控制器的內容以及由導航控制器管理的導航欄和可選工具欄。 UIKit包括幾個容器視圖控制器,包括UINavigationController,UISplitViewController和UIPageViewController。

容器視圖控制器的視圖總是填充給它的空間。 容器視圖控制器通常作為根視圖控制器安裝在窗口中(如圖2-2所示),但它們也可以以模態方式顯示或作為其他容器的子項安裝。 容器負責適當地定位其子視圖。 在圖中,容器并排放置兩個子視圖。 雖然它取決于容器接口,但是子視圖控制器可能具有對容器和任何同級視圖控制器的最小的了解。

圖2-2 用作根視圖控制器的容器

VCPG-container-acting-as-root-view-controller_2-2_2x.png

因為容器視圖控制器管理其子視圖控制器,所以UIKit定義了如何在自定義容器中設置這些子視圖控制器的規則。

呈現視圖控制器

呈現視圖控制器用當前視圖控制器的內容替換當前視圖控制器的內容,通常隱藏先前的視圖控制器的內容。 呈現視圖控制器最常用于模板顯示新內容。 例如,你可能會提供一個視圖控制器來收集用戶的輸入。 你還可以將它們用作應用程序界面的常規構建塊。

當你呈現視圖控制器時,UIKit在顯示視圖控制器和呈現的視圖控制器之間創建關系,如圖2-3所示。 (從呈現的視圖控制器到其顯示視圖控制器之間還存在反向關系。)這些關系形成視圖控制器層次結構的一部分,并且是在運行時定位其他視圖控制器的一種方式。

圖2-3 呈現視圖控制器

VCPG-presented-view-controllers_2-3_2x.png

當涉及容器視圖控制器時,UIKit可以修改呈現鏈以簡化您必須編寫的代碼。 不同的呈現樣式對于其在屏幕上的呈現方式有不同的規則,例如,全屏呈現始終覆蓋整個屏幕。 當您呈現視圖控制器時,UIKit會查找為該呈現控制器提供合適上下文的視圖控制器。 在許多情況下,UIKit選擇最近的容器視圖控制器,但它也可以選擇窗口的根視圖控制器。 在某些情況下,你還可以告訴UIKit哪個視圖控制器定義了呈現視圖控制器的上下文,并且應該處理呈現視圖控制器。

圖2-4顯示了為什么容器通常為呈現視圖控制器提供上下文。 當執行全屏呈現時,新的視圖控制器需要覆蓋整個屏幕。 不是要求子視圖控制器知道其容器的邊界,容器決定是否處理顯示。 因為示例中的導航控制器覆蓋整個屏幕,所以它用作呈現視圖控制器并且發起展示。

圖2-4個容器和一個被呈現的視圖控制器

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

推薦閱讀更多精彩內容