大家没有看错,我要说的就是这个老生常谈的问题,也就是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
好了,我了解的也不多,就这么着了。