ViewController的層級(jí)結(jié)構(gòu)

前言

為什么翻譯這系列文章

概述

大多數(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)容潜沦。

window和rootViewController之間的關(guān)系
window和rootViewController之間的關(guān)系

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的一種方法。

呈現(xiàn)ViewController
呈現(xiàn)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)操作。

容器類視圖控制器呈現(xiàn)ViewController
容器類視圖控制器呈現(xiàn)ViewController

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梢为,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铸董,老刑警劉巖祟印,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異粟害,居然都是意外死亡蕴忆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門悲幅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)套鹅,“玉大人,你說(shuō)我怎么就攤上這事汰具∽柯梗” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵留荔,是天一觀的道長(zhǎng)吟孙。 經(jīng)常有香客問我,道長(zhǎng)存谎,這世上最難降的妖魔是什么拔疚? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮既荚,結(jié)果婚禮上稚失,老公的妹妹穿的比我還像新娘。我一直安慰自己恰聘,他們只是感情好句各,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晴叨,像睡著了一般凿宾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兼蕊,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天初厚,我揣著相機(jī)與錄音,去河邊找鬼孙技。 笑死产禾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牵啦。 我是一名探鬼主播亚情,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哈雏!你這毒婦竟也來(lái)了楞件?” 一聲冷哼從身側(cè)響起衫生,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎土浸,沒想到半個(gè)月后罪针,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栅迄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年站故,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毅舆。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡西篓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出憋活,到底是詐尸還是另有隱情岂津,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布悦即,位于F島的核電站吮成,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辜梳。R本人自食惡果不足惜粱甫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望作瞄。 院中可真熱鬧茶宵,春花似錦、人聲如沸宗挥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)契耿。三九已至瞒大,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搪桂,已是汗流浹背透敌。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留踢械,地道東北人拙泽。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像裸燎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泼疑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容