Storyboard和Xib加载控制器的机制理解

2016-09-21  本文已影响466人  没刀的大佐

文档中关于�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方法, 视图被加载出来后, 此时控件的连线与事件连接才完成

上一篇 下一篇

猜你喜欢

热点阅读