前言
概述
大多數(shù)情況下鹰椒,一個(gè)App會(huì)有多個(gè)ViewController組成,每個(gè)ViewController定義著它自己的行為,你它們組合在一起队询,完成你的App所表達(dá)的功能佃迄。UIKit期望開發(fā)者按照指定的規(guī)則使用ViewController嘴高。維持ViewController之間的正確關(guān)系以保證當(dāng)將用戶行為交付給正確的ViewController。如果你打破了規(guī)則和呈現(xiàn)關(guān)系和屎,App的部分行為將不會(huì)如你所愿拴驮。
Root ViewController
rootViewController是ViewController層級(jí)結(jié)構(gòu)中的一個(gè)節(jié)點(diǎn),每個(gè)Window都有一個(gè)rootViewController,rootViewController的內(nèi)容填充這個(gè)Window柴信。rootViewController里定義了用戶打開App后看到的最初內(nèi)容套啤。下圖展示window和rootViewController之間的關(guān)系。由于window沒有可被用戶看到的內(nèi)容随常,ViewController提供了所有的可是內(nèi)容潜沦。

rootViewController與UIWindow對(duì)象的rootViewController屬性相關(guān)聯(lián)。如果你使用stroyboard來(lái)設(shè)置你的ViewController绪氛,UIkit會(huì)在App啟動(dòng)的時(shí)候自動(dòng)為該屬性賦值唆鸡。如果你手寫代碼,一定要為該屬性賦值枣察。
容器視圖控制器
容器類視圖控制器可以讓你構(gòu)建的復(fù)雜頁(yè)面争占,更加易于管理和重用。容器類視圖控制器將一個(gè)或多個(gè)子視圖控制器的內(nèi)容與其他自定義的視圖結(jié)合在一起序目,形成最終的用戶界面臂痕。比如:UINavigationController對(duì)象將子視圖控制器的內(nèi)容與導(dǎo)航條結(jié)合在一起來(lái)展示內(nèi)容。UIKit定義了幾個(gè)容器類型的視圖控制器猿涨,包括UINavigationController握童、UISpliteViewController、UIPageViewController叛赚。
容器類視圖控制器的視圖總是會(huì)填充給定它的空間澡绩。容器類視圖控制器經(jīng)常作為window的rootViewController,如下圖所示俺附,當(dāng)然肥卡,它們也可以以模態(tài)(presented modally)的方式呈現(xiàn)或者作為其他容器視圖的子視圖。容器視圖負(fù)責(zé)放置子視圖的位置昙读。在下圖中召调,容器視圖將兩個(gè)子視圖并排放置。雖然子視圖控制器的顯示是依據(jù)容器視圖的,但子視圖控制器對(duì)容器視圖卻知之甚少唠叛。

因?yàn)槿萜餍涂刂破鞴芾碚咚淖右晥D控制器只嚣,UIKit框架定義了在自定義容器中如何設(shè)置它們子視圖控制器的規(guī)則。關(guān)于如何自定義容器視圖控制艺沼,可以參考:Implementing a Container View Controller
展示視圖控制器
展現(xiàn)一個(gè)新的ViewController來(lái)替換當(dāng)前的ViewController的內(nèi)容册舞,通常會(huì)隱藏先前的ViewController的內(nèi)容。presentations 經(jīng)常使用模態(tài)的方式展示新內(nèi)容障般,比如:你可以展現(xiàn)一個(gè)ViewController來(lái)收集用戶的輸入信息调鲸。你也可以使用它展示一個(gè)App內(nèi)的普通模塊。
當(dāng)你present一個(gè)ViewController的時(shí)候挽荡,UIKit框架會(huì)在要展示的ViewController和正在展示的ViewController之間建立一個(gè)關(guān)系(這里存在一個(gè)與這個(gè)關(guān)系相反的關(guān)系藐石。),如下圖所示定拟。這些關(guān)系是ViewController的層級(jí)結(jié)構(gòu)的一部分于微,也是在運(yùn)行時(shí)定位其他ViewController的一種方法。

當(dāng)涉及到容器類型的ViewController時(shí)青自,你需要寫一點(diǎn)簡(jiǎn)單的代碼讓UIKit框架修改展示鏈株依。不同的展現(xiàn)方式有不同的呈現(xiàn)在屏幕上的規(guī)則。比如:一個(gè)全屏的呈現(xiàn)(presentation)總是覆蓋真?zhèn)€屏幕延窜。當(dāng)你呈現(xiàn)(present)一個(gè)ViewController的時(shí)候恋腕,UIKit尋找一個(gè)ViewController作為合適的上下文來(lái)提供展示操作,在許多情況下逆瑞,UIKit選擇最近的容器類視圖控制器荠藤,但它也可能選擇window的根視圖控制器。在某些情況下呆万,你也可以告訴UIKit選擇哪一個(gè)ViewController作為呈現(xiàn)的上下文并處理呈現(xiàn)操作商源。
在下圖中,展示了為什么容器控制器通常作為呈現(xiàn)操作的上下文谋减,當(dāng)展示一個(gè)全屏呈現(xiàn)時(shí),新的ViewController需要覆蓋整個(gè)屏幕扫沼。容器控制器來(lái)決定是否處理呈現(xiàn)操作出爹,而不是要求子視圖控制器知道它所屬容器的尺寸。在下面的例子中缎除,導(dǎo)航控制器覆蓋了整個(gè)屏幕严就,它來(lái)執(zhí)行ViewController的呈現(xiàn)操作。

關(guān)于更多的presentations信息器罐,請(qǐng)參考:The Presentation and Transition Process