Ziank的技术博客

VIEW加载和显示函数调用顺序

大家没有看错,我要说的就是这个老生常谈的问题,也就是iOS中得ViewController加载和显示view时的函数调用顺序。其实大部分人都知道这些函数的调用顺序,但是,我们还是要再说一下,主要是要强调一下这些函数分别应该实现什么样的功能和注意点。

先说一下顺序吧,免得真有一些人不了解:

  • initWithNibName: bundle:
  • viewDidLoad
  • viewWillAppear:
  • viewWillLayoutSubViews
  • viewDidLayoutSubViews
  • viewDidAppear:
  • viewWillDisappear:
  • viewDidDisappear:
  • dealloc

这些函数就描述了一个view从加载到释放的整个过程。在对应的函数中需要实现和处理的功能应该有如下的考虑。

-initWithNibName: bundle:

该函数是ViewController的初始化函数,必须调用父类的相应初始化方法,而且应该在函数的最开始位置进行调用。调用之前,绝对不可以使用self对象。即使已经调用了父类方法,也不可以在该方法中使用self.view。建议在init方法中直接使用下划线开始的成员对象,不要使用self进行引用。

-viewDidLoad

该方法在view加载完成之后调用。之所以在init中不能够使用self.view就是因为如果使用,会在init完成之前就调用该方法,可能会导致错误。

viewDidLoad中应该实现的功能是在nib文件中无法实现的界面绘制,以及成员对象的初始化,不应该在该函数中执行耗时的操作(如网络操作)。

-viewWillAppear:

该方法在界面出现前调用,可能一个界面会多次出现,那么每次出现之前都会调用该方法。特别是iOS 8推出的右划返回功能,每次将要返回到该界面的时候都会调用该方法,即使没有真正的返回。

该方法中应该实现一些界面显示之前需要做的准备工作,比如需要请求数据,或者某些按钮需要判断是否显示等功能。还有就是一些Notification的监听事件可以在这里添加。

-viewWillLayoutSubViews

该方法不建议重写,因为每次显示都可能调用多次。

-viewDidLayoutSubViews

和viewWillLayoutSubViews一样,每次显示都可能调用多次该方法,所以在该方法中只允许修改subView的位置和大小,尽量不要添加或删除subView。如果一定要添加的话,请注意限制只添加一次。

-viewDidAppear:

该方法和viewWillAppear不同,只有当页面完全显示之后才会调用,所以一些界面显示之后需要做的操作建议放在这个方法里,这样可以提高界面切换的效率。放在viewDidLoad和viewWillAppear中都会影响界面的切换效率。

-viewWillDisappear:

建议在这里删除当前界面的Notification监听,避免出现收到notification却执行错误的情况。这个函数实在界面消失之前调用的,所以和viewWillAppear相似,iOS8的右划返回功能滑动时,会调用当前界面的该函数,无论是否真正返回。

-viewDidDisappear:

该方法和viewDidAppear对应,只有当界面完全消失后才会调用,建议在这个函数里可以执行一些界面消失后的内容清空处理。

-dealloc

针对ARC架构来说,这个函数里不应该执行任何额外的操作。如果使用MRC,需要在该函数里释放对应的成员对象。

主要就说这么一些吧,另外就是界面切换时显示和消失的顺序为:

假设界面A切换到界面B

A -> viewWillDisappear

B -> viewWillAppear

A -> viewDidDisappear

B -> viewDidAppear

好了,我了解的也不多,就这么着了。