UIViewController的完整生命周期

来源:互联网 发布:淘宝提高销量技巧 编辑:程序博客网 时间:2024/05/02 00:34


 

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

-loadView

-viewDidLoad

-viewWillAppear:

-viewDidAppear:

-viewWillDisappear:

-viewDidDisappear:

Interface Builder(IB)Mac OS X平台下用于设计和测试用户界面(GUI)的应用程序(非开源)。通常你只需要通过简单的拖拽(drag-n-drop)操作来构建GUI就可以了。IB使用Nib文件储存GUI资源Interface Builder工具是在iPhone SDK中提供的。该工具通常用于Mac OS X开发和iPhone应用程序开发。Interface Builder提供了拖放面板以供iOS开发人员将控件拖放到屏幕上

Nib文件是一种特殊类型的资源文件,它用于保存iPhone OSMac OS X应用程序的用户接口。Nib文件是Interface Builder文档。通常您会使用Interface Builder设计应用程序的可视部分-例如窗口或视图。有些时候,您可能也用它来配置一些不可视的对象,例如控制器对象(用于管理窗口和视图)。实际上,所有这些操作都是在编辑一份Interface Builder文档,即在创建一份对象图。保存文件的时候,就是将该对象图进行归档,加载文件的时候,就是将对象图进行解档。

Nib文件也就是对象图-可以包含占位对象,这种对象用于指涉存在于文档之外的对象。这些对象虽然不在文档中,但却可能含有文档内对象的引用,或者被文档内的对象引用。文件拥有者就是一种特殊的占位对象

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

     手工创建视图时,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创建一个controllernib文件,然后在xocde中通过initWithNibName来实例化这个controller,那么这个controllerinitWithCoder会被调用。

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控制器时,注意出现顺序如下:

· -[ViewController viewWillDisappear:]

· -[HYBViewController viewWillAppear:]

· -[HYBViewController viewDidAppear:]

· -[ViewController viewDidDisappear:]

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

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

0 0