生命周期如下:xib/storyboard-initWithCoder:,而非xib/storyboard的是-initWithNibName:bundle:然后-init

-loadView

-viewDidLoad

-viewWillAppear:

-viewDidAppear:

-viewWillDisappear:

-viewDidDisappear:

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

     手工创建视图时,loadView被调用时self.view还为nil。一般在该方法中手工定制view。
      XIB创建视图时,loadView仍会被调用、loadView被调用时XIB定制的视图还没创建完成,若是再覆写该方法的话、会将XIB定制的视图覆盖掉。
所以,纯手工定制视图时,一般在该方法中写;XIB定制视图时、不要覆写该方法。

2,无论XIB还是代码创建都会调用viewDidLoad方法。
     手工创建视图时,viewDidLoad被调用时self.view已经创建完成。可在在该方法中进一步定制视图。
      XIB创建视图时,viewDidLoad仍会被调用,viewDidLoad被调用时self.view已经创建完成。可在在该方法中进一步定制视图。
所以,无论那种方式定制视图、都可以覆写该方法。

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

4, initWithCoder是一个类在IB中创建但在xocdde中被实例化时被调用的.比如,通过IB创建一个controller的nib文件,然后在xocde中通过initWithNibName来实例化这个controller,那么这个controller的initWithCoder会被调用。


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

举个简单的例子说明问题

 

,先出现ViewController,然后在点击ViewController上的按钮时,模态弹出了一个纯代码HYBViewController,其打印如下:

 

 

-[ViewControllerinitWithCoder:]

-[ViewControllerloadView]

-[ViewControllerviewDidLoad]

-[ViewControllerviewWillAppear:]

-[ViewControllerviewDidAppear:]

// present HYBViewController

-[HYBViewControllerinitWithNibName:bundle:]

-[HYBViewControllerinit]

-[HYBViewControllerloadView]

-[HYBViewControllerviewDidLoad]

-[ViewControllerviewWillDisappear:]

-[HYBViewControllerviewWillAppear:]

-[HYBViewControllerviewDidAppear:]

-[ViewControllerviewDidDisappear:]

 

注意,当从ViewController进入到HYBViewController控制器时,注意出现顺序如下:

在HYBViewController完全出现后,才会调用前一个控制器的完全消失。像这种要不同控制器之间导航条隐藏与显示控制问题,就需要特别注意其生命周期的顺序。

当我们所写的程序里没用用Nib文件(XIB)时,用代码控制视图内容,需要调用initWithFrame去初始化用于视图加载nib文件,从nib中加载对象实例时使用 initWithCoder初始化这些实例对象