文檔中關(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
方法, 視圖被加載出來后, 此時控件的連線與事件連接才完成