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类的指定初始值设定项
总结
方法虽然多,分清哪个方法用来初始化哪个类才是重要的。