Storyboard和Xib加載控制器的機制理解

文檔中關(guān)于?Nib文件的描述:

A nib file is a data archive that essentially contains a set of freeze-dried objects that you want to recreate at runtime. Nib files are used most commonly to store preconfigured windows, views, and other visually oriented objects but they can also store nonvisual objects such as controllers.

Nib文件的本質(zhì)是數(shù)據(jù)存檔, 包含了一組你想在運行時重新創(chuàng)建的對象. Nib文件最常用的用于存儲預先配置好的窗口, 視圖, 和其它視覺導向?qū)ο? 但也能存儲如控制器等非可視對象.

備注: Xib是由Nib演變過來的. Nib文件是可執(zhí)行的二進制文件; 而Xib是基于XML的描述文件, 可以由Interface Builder(圖形界面編輯器)實現(xiàn)可視化編輯. 最終會轉(zhuǎn)化成可執(zhí)行的nib文件


通過Xib創(chuàng)建視圖控制器時的相關(guān)表現(xiàn)

UIViewController類中相關(guān)代碼的觸發(fā)

通過Xib來創(chuàng)建視圖控制器時, ViewController類會執(zhí)行initWithNibName:Bundle來加載Xib文件

// 該方法是加載指定的Xib文件 
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

但并沒有觸發(fā)-initWithCoder, 因為并沒有實例化和初始化視圖控制器對象(Xib文件只與一個視圖控制器關(guān)聯(lián)),

// Storyboard或Xib由該方法進行解檔, 重新實例化和初始化當中保存的對象
- (instancetype)initWithCoder:(NSCoder *)aDecoder

因此也不會觸發(fā)awakeFromNib, 因為根本沒有視圖控制器的Nib解檔操作

// 當解檔加載的操作完成后, 會調(diào)用該方法
- (void)awakeFromNib

UIView類中相關(guān)代碼的觸發(fā)

Xib文件解檔的重點, 就是將里面保存的視圖與控件的對象重新進行實例化和初始化, 因此, Xib文件解檔時, View類會觸發(fā)-initWithCoder, 來解檔對象的數(shù)據(jù)并加載

// Storyboard或Xib由該方法進行解檔, 重新實例化和初始化當中保存的對象
- (instancetype)initWithCoder:(NSCoder *)aDecoder

解檔加載完成后, 會觸發(fā)-awakeFromNib, 此時控件的連線與事件連接已經(jīng)完成

// 當解檔加載的操作完成后, 會調(diào)用該方法
- (void)awakeFromNib

通過Storyboard創(chuàng)建視圖控制器時的相關(guān)表現(xiàn)

加載Storyboard時, 視圖控制器, 視圖, 和控件都有對應的對象被解檔出來(Storyboard文件包含多個視圖控制器), 因此, ViewController類View類都會觸發(fā)-initWithCoder方法

// Storyboard或Xib由該方法進行解檔, 重新實例化和初始化當中保存的對象
- (instancetype)initWithCoder:(NSCoder *)aDecoder

解檔加載完成后, 會觸發(fā)-awakeFromNib, 如果是View類, 此時已經(jīng)完成了控件的連線與事件連接.

// 當解檔加載的操作完成后, 會調(diào)用該方法
- (void)awakeFromNib

由于視圖控制器的根視圖會在第一次使用時, 通過-loadView加載, 因此-awakeFromNib方法完成時, ViewController類中控件的連線與事件連接都還沒有完成 (控件都還沒有加載出來)

// 視圖控制器的根視圖懶加載方法, 該方法會通過加載Nib文件或創(chuàng)建UIView實例來得到根視圖. 
// 可以通過重寫該方法來實現(xiàn)自定義的根視圖
- (void)loadView

當視圖控制器執(zhí)行了-loadView方法, 視圖被加載出來后, 此時控件的連線與事件連接才完成

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖睁搭,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異证逻,居然都是意外死亡义桂,警方通過查閱死者的電腦和手機畴栖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門随静,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吗讶,你說我怎么就攤上這事燎猛。” “怎么了照皆?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵重绷,是天一觀的道長。 經(jīng)常有香客問我膜毁,道長论寨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任爽茴,我火速辦了婚禮,結(jié)果婚禮上绰垂,老公的妹妹穿的比我還像新娘室奏。我一直安慰自己,他們只是感情好劲装,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布胧沫。 她就那樣靜靜地躺著,像睡著了一般占业。 火紅的嫁衣襯著肌膚如雪绒怨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天谦疾,我揣著相機與錄音南蹂,去河邊找鬼。 笑死念恍,一個胖子當著我的面吹牛六剥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播峰伙,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疗疟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瞳氓?” 一聲冷哼從身側(cè)響起策彤,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后店诗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裹刮,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年必搞,在試婚紗的時候發(fā)現(xiàn)自己被綠了必指。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡恕洲,死狀恐怖塔橡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霜第,我是刑警寧澤葛家,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站泌类,受9級特大地震影響癞谒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刃榨,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一弹砚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枢希,春花似錦桌吃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至搬卒,卻和暖如春瑟俭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背契邀。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工摆寄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蹂安。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓椭迎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親田盈。 傳聞我的和親對象是個殘疾皇子畜号,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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