iOS视图控制器初始化总结
首先,区别viewcontroller初始化的三种方式:完全代码化,半代码化初始和IB初始的区别
- 代码化:完全没有Xib之类的东西,通过纯代码实现加载.
- 半代码化:设计xib,然后在程序中用代码调用xib来初始化.
- 完全IB化:设计xib之类,然后加入到其它xib里.如MainWindow.xib中加入rootviewController,而rootviewcontroller通过xib设计.
好了,了解了这些,来看看各种方法的使用.
- viewDidLoad:这个方法在三种方式下都会调用,而且是加载完view后调用.
- loadView:代码化时调用. 半代码化和完全IB化时亦调用,但会重写xib中的view,调用在initwithNibName之后,viewDidLoad之前.
- initWithNibName:半代码化初始时使用. 完全IB化初始时不调用. 代码化初始时会通过init调用,且调用在[super init]中.
- awakeFromNib:awakeFromNib这个方法是一个类在IB中被实例化时被调用的.看了帖子发现大家都推荐使用viewDidLoad而不要使用awakeFromNib,应为viewDidLoad会被多次调用,而awakeFromNib只会当从nib文件中unarchive的时候才会被调用一次.实际测试中发现,当一个类的awakeFromNib被调用的时候,那么这个类的viewDidLoad就不会被调用了,这个感觉很奇怪.
- initWithCoder,涉及到序列化,即对象自己解析文件时用到的,也可以用在视图控制器类半代码化实例时.比如,通过IB创建一个controller的nib文件,然后在xocde中通过initWithNibName来实例化这个controller,那么这个controller的initWithCoder会被调用.
- 调用顺序:
[super init](可选)
-> initWithNibName(其实在super init中) -> int after self created -> loadView -> ViewDidLoad
- 原文作者:mlyixi
- 原文链接:https://mlyixi.github.io/post/osx/iOS%E8%A7%86%E5%9B%BE%E6%8E%A7%E5%88%B6%E5%99%A8%E5%88%9D%E5%A7%8B%E5%8C%96%E6%80%BB%E7%BB%93/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。