Storyboard和Xib加載控制器的機(jī)制理解

文檔中關(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ù)存檔, 包含了一組你想在運(yùn)行時重新創(chuàng)建的對象. Nib文件最常用的用于存儲預(yù)先配置好的窗口, 視圖, 和其它視覺導(dǎo)向?qū)ο? 但也能存儲如控制器等非可視對象.

備注: Xib是由Nib演變過來的. Nib文件是可執(zhí)行的二進(jìn)制文件; 而Xib是基于XML的描述文件, 可以由Interface Builder(圖形界面編輯器)實(shí)現(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, 因?yàn)?strong>并沒有實(shí)例化和初始化視圖控制器對象(Xib文件只與一個視圖控制器關(guān)聯(lián)),

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

因此也不會觸發(fā)awakeFromNib, 因?yàn)楦緵]有視圖控制器的Nib解檔操作

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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