應(yīng)用程序視圖控制器之間的關(guān)系定義了每個(gè)視圖控制器所需的行為撤防。 UIKit希望你以規(guī)定的方式使用視圖控制器。 維護(hù)適當(dāng)?shù)囊晥D控制器關(guān)系可確保在需要時(shí)將自動(dòng)行為傳遞到正確的視圖控制器。 如果你違反規(guī)定的遏制和演示關(guān)系膜廊,你應(yīng)用的某些部分將停止按預(yù)期行為拙已。
根視圖控制器
根視圖控制器是視圖控制器層次結(jié)構(gòu)的錨點(diǎn)。 每個(gè)窗口只有一個(gè)根視圖控制器袜茧,其內(nèi)容填充該窗口菜拓。根視圖控制器定義用戶看到的初始內(nèi)容。 圖2-1顯示了根視圖控制器和窗口之間的關(guān)系笛厦。 因?yàn)榇翱跊]有自己的可見內(nèi)容纳鼎,所以視圖控制器的視圖提供了所有的內(nèi)容。
圖2-1 根視圖控制器
可以從UIWindow對(duì)象的rootViewController屬性訪問根視圖控制器。 當(dāng)你使用故事板配置視圖控制器時(shí)贱鄙,UIKit會(huì)在啟動(dòng)時(shí)自動(dòng)設(shè)置該屬性的值劝贸。 對(duì)于以編程方式創(chuàng)建的窗口,必須自己設(shè)置根視圖控制器逗宁。
容器視圖控制器
容器視圖控制器允許你從更易于管理和可重復(fù)使用的部分組裝復(fù)雜的接口映九。 容器視圖控制器將一個(gè)或多個(gè)子視圖控制器的內(nèi)容與可選的自定義視圖相混合以創(chuàng)建其最終界面。 例如瞎颗,UINavigationController對(duì)象顯示來自子視圖控制器的內(nèi)容以及由導(dǎo)航控制器管理的導(dǎo)航欄和可選工具欄件甥。 UIKit包括幾個(gè)容器視圖控制器,包括UINavigationController哼拔,UISplitViewController和UIPageViewController引有。
容器視圖控制器的視圖總是填充給它的空間。 容器視圖控制器通常作為根視圖控制器安裝在窗口中(如圖2-2所示)倦逐,但它們也可以以模態(tài)方式顯示或作為其他容器的子項(xiàng)安裝譬正。 容器負(fù)責(zé)適當(dāng)?shù)囟ㄎ黄渥右晥D。 在圖中僻孝,容器并排放置兩個(gè)子視圖导帝。 雖然它取決于容器接口,但是子視圖控制器可能具有對(duì)容器和任何同級(jí)視圖控制器的最小的了解穿铆。
圖2-2 用作根視圖控制器的容器
因?yàn)槿萜饕晥D控制器管理其子視圖控制器您单,所以UIKit定義了如何在自定義容器中設(shè)置這些子視圖控制器的規(guī)則。
呈現(xiàn)視圖控制器
呈現(xiàn)視圖控制器用當(dāng)前視圖控制器的內(nèi)容替換當(dāng)前視圖控制器的內(nèi)容荞雏,通常隱藏先前的視圖控制器的內(nèi)容虐秦。 呈現(xiàn)視圖控制器最常用于模板顯示新內(nèi)容。 例如凤优,你可能會(huì)提供一個(gè)視圖控制器來收集用戶的輸入悦陋。 你還可以將它們用作應(yīng)用程序界面的常規(guī)構(gòu)建塊。
當(dāng)你呈現(xiàn)視圖控制器時(shí)筑辨,UIKit在顯示視圖控制器和呈現(xiàn)的視圖控制器之間創(chuàng)建關(guān)系俺驶,如圖2-3所示。 (從呈現(xiàn)的視圖控制器到其顯示視圖控制器之間還存在反向關(guān)系棍辕。)這些關(guān)系形成視圖控制器層次結(jié)構(gòu)的一部分暮现,并且是在運(yùn)行時(shí)定位其他視圖控制器的一種方式。
圖2-3 呈現(xiàn)視圖控制器
當(dāng)涉及容器視圖控制器時(shí)楚昭,UIKit可以修改呈現(xiàn)鏈以簡化您必須編寫的代碼栖袋。 不同的呈現(xiàn)樣式對(duì)于其在屏幕上的呈現(xiàn)方式有不同的規(guī)則,例如抚太,全屏呈現(xiàn)始終覆蓋整個(gè)屏幕塘幅。 當(dāng)您呈現(xiàn)視圖控制器時(shí)昔案,UIKit會(huì)查找為該呈現(xiàn)控制器提供合適上下文的視圖控制器。 在許多情況下电媳,UIKit選擇最近的容器視圖控制器踏揣,但它也可以選擇窗口的根視圖控制器。 在某些情況下匆背,你還可以告訴UIKit哪個(gè)視圖控制器定義了呈現(xiàn)視圖控制器的上下文呼伸,并且應(yīng)該處理呈現(xiàn)視圖控制器。
圖2-4顯示了為什么容器通常為呈現(xiàn)視圖控制器提供上下文钝尸。 當(dāng)執(zhí)行全屏呈現(xiàn)時(shí),新的視圖控制器需要覆蓋整個(gè)屏幕搂根。 不是要求子視圖控制器知道其容器的邊界珍促,容器決定是否處理顯示。 因?yàn)槭纠械膶?dǎo)航控制器覆蓋整個(gè)屏幕剩愧,所以它用作呈現(xiàn)視圖控制器并且發(fā)起展示猪叙。
圖2-4個(gè)容器和一個(gè)被呈現(xiàn)的視圖控制器