應(yīng)用的視圖控制器之間的關(guān)系定義了每個(gè)視圖控制器所需要的行為。UIKit希望你以規(guī)定的方式使用視圖控制器。保持適當(dāng)?shù)囊晥D控制器關(guān)系可以保證自動(dòng)行為交付到正確的視圖控制器。如果你違反了規(guī)定容器和展示之間的關(guān)系,你的部分應(yīng)用會(huì)停止預(yù)期行為。
根視圖控制器
根視圖控制器是視圖控制器層級(jí)的錨。每個(gè)窗口都有一個(gè)根視圖控制器來(lái)填充窗口。根視圖控制器定義了用戶初始看到的內(nèi)容。圖2-1展示了視圖控制器和窗口間的關(guān)系。因?yàn)榇翱跊](méi)有自己的可見(jiàn)內(nèi)容,視圖控制器的視圖提供了所有的內(nèi)容。

可以通過(guò)UIWindow對(duì)象的rootViewController屬性訪問(wèn)根視圖控制器。當(dāng)你使用storyboard來(lái)配置視圖控制器,UIKit在啟動(dòng)時(shí)自動(dòng)設(shè)置這個(gè)屬性的值。如果窗口是以編程的方式創(chuàng)建的,你必須自己設(shè)置根視圖控制器。
容器視圖控制器
容器視圖控制器讓你匯編復(fù)雜接口使得更好管理和重用。容器視圖控制器利用一個(gè)或多個(gè)子視圖控制器的內(nèi)容與可選自定義視圖來(lái)創(chuàng)建最終的界面。例如,UINavigationController對(duì)象展示有導(dǎo)航欄和工具欄的子視圖控制器的內(nèi)容,導(dǎo)航控制器負(fù)責(zé)管理他們,UIKit包含幾個(gè)容器視圖控制器,包括UINavigationController,UISplitViewController,和UIPageViewController。
容器視圖控制器的視圖總是充滿整個(gè)空間。容器視圖控制器通常作為窗口的根視圖控制器(如圖2-2),但他們也可以以模態(tài)的方式present或者作為其他容器的孩子。容器負(fù)責(zé)定位它的子視圖。在圖中,容器并排的放置兩個(gè)子視圖。雖然這取決于容器接口,子視圖控制器幾乎不知道該容器和其他同級(jí)視圖控制器。

因?yàn)槿萜饕晥D控制器管理其孩子,UIKit定義在自定義容器中如何設(shè)置這些孩子的規(guī)則。關(guān)于如何創(chuàng)建自定義容器視圖控制器的詳細(xì)信息,參見(jiàn)實(shí)現(xiàn)容器視圖控制器(Implementing a Container View Controller)。
Presented視圖控制器
Present一個(gè)視圖控制器通常會(huì)用新的視圖控制器來(lái)取代當(dāng)前視圖控制器的內(nèi)容,通常隱藏上一個(gè)視圖控制器的內(nèi)容。Present方式通常用于顯示新內(nèi)容。例如,present一個(gè)視圖控制器來(lái)收集用戶的輸入。也可以使用它們作為應(yīng)用接口的通用組成部分。
當(dāng)present一個(gè)視圖控制器,UIKit為presenting視圖控制器和presented視圖控制器間創(chuàng)建關(guān)系,如圖2-3所示。(Presented視圖控制器和presenting視圖控制器間還有一個(gè)反向關(guān)系。)這些關(guān)系形成視圖控制器層次的一部分,同時(shí)也是運(yùn)行時(shí)查找其他視圖控制器的一種方式。

圖2-3 presented視圖控制器
當(dāng)涉及到容器視圖控制器,UIKit可能修改presentation鏈來(lái)簡(jiǎn)化必須編寫的代碼。不同的present風(fēng)格在屏幕上顯示有不同的規(guī)則,例如,全屏present方式總是覆蓋整個(gè)屏幕。當(dāng)你present一個(gè)視圖控制器,UIKit尋找一個(gè)為present提供合適環(huán)境的視圖控制器。在許多情況下,UIKit選擇最近的視圖控制器,但它也可能選擇窗口的根視圖控制器。在某些情況下,你可以告知UIKit哪個(gè)視圖控制器定義了present的內(nèi)容并處理present。
圖2-4展示了為什么容器通常為present提供環(huán)境。當(dāng)執(zhí)行一個(gè)全屏present,新視圖控制器需要覆蓋整個(gè)屏幕。而不是要求孩子知道容器的bound,是否需要處理present。因?yàn)樵诶又械膶?dǎo)航控制器覆蓋整個(gè)屏幕,它present視圖控制器并開(kāi)始present。

更多關(guān)于present的信息,參見(jiàn)present和transit的過(guò)程(The Presentation and Transition Process)。