翻譯:iOS視圖控制器編程指南(二)——視圖控制器層級(jí)結(jié)構(gòu)(The View Controller Hierarchy)

應(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)容。


圖2-1根視圖控制器

可以通過(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í)視圖控制器。

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

因?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。


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

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

官方原文地址:

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容