文檔中關(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)行時(shí)重新創(chuàng)建的對(duì)象. Nib文件最常用的用于存儲(chǔ)預(yù)先配置好的窗口, 視圖, 和其它視覺(jué)導(dǎo)向?qū)ο? 但也能存儲(chǔ)如控制器等非可視對(duì)象.
備注: Xib是由Nib演變過(guò)來(lái)的. Nib文件是可執(zhí)行的二進(jìn)制文件; 而Xib是基于XML的描述文件, 可以由Interface Builder(圖形界面編輯器)實(shí)現(xiàn)可視化編輯. 最終會(huì)轉(zhuǎn)化成可執(zhí)行的nib文件
通過(guò)Xib創(chuàng)建視圖控制器時(shí)的相關(guān)表現(xiàn)
UIViewController類中相關(guān)代碼的觸發(fā)
通過(guò)Xib來(lái)創(chuàng)建視圖控制器時(shí), ViewController類會(huì)執(zhí)行initWithNibName:Bundle來(lái)加載Xib文件
// 該方法是加載指定的Xib文件
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
但并沒(méi)有觸發(fā)-initWithCoder, 因?yàn)?strong>并沒(méi)有實(shí)例化和初始化視圖控制器對(duì)象(Xib文件只與一個(gè)視圖控制器關(guān)聯(lián)),
// Storyboard或Xib由該方法進(jìn)行解檔, 重新實(shí)例化和初始化當(dāng)中保存的對(duì)象
- (instancetype)initWithCoder:(NSCoder *)aDecoder
因此也不會(huì)觸發(fā)awakeFromNib, 因?yàn)楦緵](méi)有視圖控制器的Nib解檔操作
// 當(dāng)解檔加載的操作完成后, 會(huì)調(diào)用該方法
- (void)awakeFromNib
UIView類中相關(guān)代碼的觸發(fā)
Xib文件解檔的重點(diǎn), 就是將里面保存的視圖與控件的對(duì)象重新進(jìn)行實(shí)例化和初始化, 因此, Xib文件解檔時(shí), View類會(huì)觸發(fā)-initWithCoder, 來(lái)解檔對(duì)象的數(shù)據(jù)并加載
// Storyboard或Xib由該方法進(jìn)行解檔, 重新實(shí)例化和初始化當(dāng)中保存的對(duì)象
- (instancetype)initWithCoder:(NSCoder *)aDecoder
解檔加載完成后, 會(huì)觸發(fā)-awakeFromNib, 此時(shí)控件的連線與事件連接已經(jīng)完成
// 當(dāng)解檔加載的操作完成后, 會(huì)調(diào)用該方法
- (void)awakeFromNib
通過(guò)Storyboard創(chuàng)建視圖控制器時(shí)的相關(guān)表現(xiàn)
加載Storyboard時(shí), 視圖控制器, 視圖, 和控件都有對(duì)應(yīng)的對(duì)象被解檔出來(lái)(Storyboard文件包含多個(gè)視圖控制器), 因此, ViewController類和View類都會(huì)觸發(fā)-initWithCoder方法
// Storyboard或Xib由該方法進(jìn)行解檔, 重新實(shí)例化和初始化當(dāng)中保存的對(duì)象
- (instancetype)initWithCoder:(NSCoder *)aDecoder
解檔加載完成后, 會(huì)觸發(fā)-awakeFromNib, 如果是View類, 此時(shí)已經(jīng)完成了控件的連線與事件連接.
// 當(dāng)解檔加載的操作完成后, 會(huì)調(diào)用該方法
- (void)awakeFromNib
由于視圖控制器的根視圖會(huì)在第一次使用時(shí), 通過(guò)-loadView加載, 因此-awakeFromNib方法完成時(shí), ViewController類中控件的連線與事件連接都還沒(méi)有完成 (控件都還沒(méi)有加載出來(lái))
// 視圖控制器的根視圖懶加載方法, 該方法會(huì)通過(guò)加載Nib文件或創(chuàng)建UIView實(shí)例來(lái)得到根視圖.
// 可以通過(guò)重寫該方法來(lái)實(shí)現(xiàn)自定義的根視圖
- (void)loadView
當(dāng)視圖控制器執(zhí)行了-loadView方法, 視圖被加載出來(lái)后, 此時(shí)控件的連線與事件連接才完成