view controller 和view的初始化

背景

这个话题应该算是基础的,一个页面需要一个view来表示,而view 通常由view controller来管理和数据的交互。只要使用view和view controlle就离不开它们的初始化。今天就来看看这些初始化的区别

困惑

开发经常用的有以下几种方法

init

initWithNibName:bundle:

initWithCoder:

initWithFrame:

loadNibNamed:owner:options:

loadView

还有相关联的两个方法:

awakeFromNib

viewDidLoad

这些方法混在一起,使用的时候总是不知道该用哪个,而它们之间的关系也不知道是什么。下面细看一下这些方法都会触发哪些流程

分析

view controller的初始化

1.initWithNibName:bundle:

xib可以让我们便捷的画出UI的轮廓,这个方法就是用指定文件夹中的nib文件来返回一个新初始化的视图控制器。

调用之后会触发以下两个函数

 1. loadView

 2. viewDidLoad

另外 ,这还是一种懒加载的方式。

2.init

这么简单初始化函数,它调用之后会发生什么呢

1.initWithNibName:bundle:

2. loadView

3. viewDidLoad

3.从stroryBoard加载

1.  initWithCoder:

2.  awakeFromNib

当然,view controller还会segue来初始化,初始化会有对应的转场所以还会调用

3.loadView

4.viewDidLoad

UIView的加载

1.loadNibNamed:owner:options:

这个方法要加载的xib的类为NSOjbect。当使用的时候File’s owner 属性应该是NSObject,主要的view应该是自定义类的类型,所有的外接属性都应该连接到view上而不是File’s owner。更重要的一点是。这个方法是用来加载view的,直到前天我才知道这个事实(我一直以为用来加载view controller )。

调用之后发生:

1.initWithCoder:

2.awakeFromNib

2.init

1.[super init] //因为我们一般都继承自UIView所以调用这句话会调用UIView的init

 2.initWithFrame//UIView的init会调用intiWithFrame,也就是子类的方法。

3.调用自身init中[super init]后的部分

3.initWithFrame:

1.initWithFrame。它只会调用自身

如果以编程方式创建视图对象,则此方法是UIView类的指定初始值设定项

总结

方法虽然多,分清哪个方法用来初始化哪个类才是重要的。

你可能感兴趣的:(view controller 和view的初始化)