视图控制器中的各种的方法

Posted by zhangsihuai on 2017-05-01

ViewController是每个iOS开发者都在打交道的东西,了解它的生命周期、它各种方法的正确使用和调用会对我们有很大的帮助

控制器的创建

  • 控制器普通创建(与Xib关联或者是纯代码)会调用init:方法。
  • 控制器从Storyboard创建,先调用该控制器的方法initWithCoder:对各个属性进行解码,接着awakeFromNib被调用,并不会调用自定的init:方法

    编译过程中,项目里用到的 SB 文件也会被编译,并以 storyboardc 为扩展名保存在最终的 app 包内。这个文件和 .bundle 或者 .framework 类似,实际上是一个文件夹,里面存储了一个描述该编译后的 SB 信息的 Info.plist 文件,以及一系列 .nib 文件。原来的 SB 中的每个对象 (或者说,一般就是每个 View Controller) 将会被编译为一个单独的 .nib,而 .nib 中包含了编码后的对应的对象层级。在加载一个 SB,并从中读取单个 View Controller 时,首先系统会找到编译后的 .storyboardc 文件,从 Info.plist 中获取所需的 View Controller 类型和 nib 的关系,来完成 UIStoryboard 的初始化。接下来读取对应的某个 nib,并使用 UINibDecoder 进行解码,将 nib 二进制还原为实际的对象,最后调用该对象的 initWithCoder: 完成各个属性的解码。在完成这些工作后,awakeFromNib 被调用,来通知开发者从 nib 的加载已经完毕。 —来自 王巍博客

控制器中的方法

  • 用于初始化 init:initWithCoder:

初始化方法中一般用于对控制器的属性进行初始化或者赋值操作,最好不要编写自定义的init:代码,因为如果视图控制器切换至故事版的话,init:方法将不会被调用

  • 视图的加载 viewDidLoad

在视图层次结构准备就绪之后,视图再被呈现给用户之前会被调用一次,可以在该方法中做一些一次性的操作。

  • 用于接收有关视图的可视性通知 viewWillAppear viewDidAppear viewWillDisappear viewDidDisappear

    • viewWillAppear:
      当视图控制器已经准备好,且视图即将被放入视图窗口时,过渡动画尚未开始,此方法会被调用。
      在这个时刻,视图对用户还是不可见的,不要启动任何视图动画,不会起任何作用。
    • viewDidAppear:
      当视图在视图窗口展示出来,且过渡动画完成后,此方法被调用。
      在这里启动或恢复任何想要呈现给用户的视图动画。
    • viewWillDisappear:
      当视图将要从屏幕上隐藏起来时调用。有可能是其它的视图控制器要接管屏幕,也有可能是该控制器要出栈。
    • viewDidDisappear:
      当视图控制器的过渡动画完成时调用。
  • 用于视图的布局 viewWillLayoutSubviews viewDidLayoutSubviews

视图的布局,在这里可以取得view中的正确尺寸。

合理的使用控制器的各个方法

列举高效使用声明周期中各个事件的例子

  1. viewDidLoad: 查看数据源是否可用。如果可用则更新UI。
  2. 若每次都需要暂时最新的信息,则在viewWillAppear:中更新UI元素。
  3. viewDidAppear:中开始动画,恢复事件,如:视频、音频的播放。
  4. 使用viewWillDisappear:中停止动画
  5. 使用viewDidDisappear:中销毁内存中复杂的数据结构、注销各类的应用事件的通知。