文档中关于�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文件的本质是数据存档, 包含了一组你想在运行时重新创建的对象. Nib文件最常用的用于存储预先配置好的窗口, 视图, 和其它视觉导向对象, 但也能存储如控制器等非可视对象.
备注: Xib是由Nib演变过来的. Nib文件是可执行的二进制文件; 而Xib是基于XML的描述文件, 可以由Interface Builder
(图形界面编辑器)实现可视化编辑. 最终会转化成可执行的nib文件
通过Xib创建视图控制器时的相关表现
UIViewController类中相关代码的触发
通过Xib
来创建视图控制器
时, ViewController类
会执行initWithNibName:Bundle
来加载Xib文件
// 该方法是加载指定的Xib文件
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
但并没有触发-initWithCoder
, 因为并没有实例化和初始化视图控制器对象(Xib文件只与一个视图控制器关联),
// Storyboard或Xib由该方法进行解档, 重新实例化和初始化当中保存的对象
- (instancetype)initWithCoder:(NSCoder *)aDecoder
因此也不会触发awakeFromNib
, 因为根本没有视图控制器的Nib解档操作
// 当解档加载的操作完成后, 会调用该方法
- (void)awakeFromNib
UIView类中相关代码的触发
Xib文件解档的重点, 就是将里面保存的视图与控件的对象重新进行实例化和初始化, 因此, Xib
文件解档时, View类
会触发-initWithCoder
, 来解档对象的数据并加载
// Storyboard或Xib由该方法进行解档, 重新实例化和初始化当中保存的对象
- (instancetype)initWithCoder:(NSCoder *)aDecoder
解档加载完成后, 会触发-awakeFromNib
, 此时控件的连线与事件连接已经完成
// 当解档加载的操作完成后, 会调用该方法
- (void)awakeFromNib
通过Storyboard创建视图控制器时的相关表现
加载Storyboard时, 视图控制器, 视图, 和控件都有对应的对象被解档出来(Storyboard文件包含多个视图控制器), 因此, ViewController类
和View类
都会触发-initWithCoder
方法
// Storyboard或Xib由该方法进行解档, 重新实例化和初始化当中保存的对象
- (instancetype)initWithCoder:(NSCoder *)aDecoder
解档加载完成后, 会触发-awakeFromNib
, 如果是View类
, 此时已经完成了控件的连线与事件连接.
// 当解档加载的操作完成后, 会调用该方法
- (void)awakeFromNib
由于视图控制器的根视图会在第一次使用时, 通过-loadView
加载, 因此-awakeFromNib
方法完成时, ViewController类
中控件的连线与事件连接都还没有完成 (控件都还没有加载出来)
// 视图控制器的根视图懒加载方法, 该方法会通过加载Nib文件或创建UIView实例来得到根视图.
// 可以通过重写该方法来实现自定义的根视图
- (void)loadView
当视图控制器执行了-loadView
方法, 视图被加载出来后, 此时控件的连线与事件连接才完成