有关UIViewController与UIView的初始化创建

UIViewController

分为下面三种情形创建 (依次调用的方法 顺序如下)

一.StoryBoard:     1.initWithCoder   ;  2.awakeFromNib   ;  3.loadView   ;  4.viewDidLoad 

二.Xib:                  1.init  ;  2.initWithNibName  ;  3.loadView  ;  4.viewDidLoad

三.纯代码:            1.init  ;  2.initWithNibName  ;  3.loadView  ;  4.viewDidLoad                                                   


UIView

分为下面三种情形创建 (依次调用的方法 顺序如下)

一.StoryBoard:     1.initWithCoder   ;  2.awakeFromNib 

二.Xib:                  1.initWithCoder   ;  2.awakeFromNib 

三.纯代码:            1.init  ;  2.initWithFrame                                                   


说明:

1)awakeFromNib和initWithCoder:差别
awakeFromNib 从xib或者storyboard加载完毕就会调用
initWithCoder: 只要对象是从文件解析来的,就会调用
同时存在会先调用initWithCoder:

2)initWithCoder: & initWithFrame:

initWithCoder:使用文件加载的对象调用(如从xib或storyBoard中创建)
initWithFrame:使用代码加载的对象调用(使用纯代码创建)
注意:所以为了同时兼顾从文件和从代码解析的对象初始化,要同时在initWithCoder: 和 initWithFrame: 中进行初始化

3),无论XIB还是代码创建都会调用loadView方法。self.view为nil时才会被调用。

      手工创建视图时,loadView被调用时self.view还为nil。一般在该方法中手工定制view。

      XIB创建视图时,loadView仍会被调用、loadView被调用时XIB定制的视图还没创建完成,若是再覆写该方法的话、会将XIB定制的视图覆盖掉。

所以,纯手工定制视图时,一般在该方法中写;XIB定制视图时、不要覆写该方法。

4),无论XIB还是代码创建都会调用viewDidLoad方法。

      手工创建视图时,viewDidLoad被调用时self.view已经创建完成。可在在该方法中进一步定制视图。

      XIB创建视图时,viewDidLoad仍会被调用,viewDidLoad被调用时self.view已经创建完成。可在在该方法中进一步定制视图。

所以,无论那种方式定制视图、都可以覆写该方法。

5),一般情况下调用 init方法或者调用initWithNibName方法实例化UIViewController;当控制器被initWithNibName:并加入到导航控制器的栈中时,它不会加载nib文件,直到nib文件被实际显示。因此控制器在nib文件中定义的内容,例如label,可能还没有实例化。此时label可能只是一个nil指针,需要额外使用代码中实现的属性来存储信息。可以在 viewWillAppear:方法中对nib实例化的对象属性进行设置

6),awakeFromNib此方法在使用IB的时候才会涉及到,当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。


你可能感兴趣的:(iOS)