UIViewController的生命周期为下图所示:
一个UIViewController从Disappeared到Appeared的顺序为:viewWillAppear - viewDidAppear。
从Appeared到Disappeared的顺序为:viewWillDisappeared - viewDidDisappear。
此外,还有loadView方法,官方解释如下:
- (void)loadView;
// This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.
经实际测试,在使用storyboard或nib情况下,重写loadView方法会造成页面异常,所以只有在使用代码布局的情况下重写loadView方法,并在loadView方法中撰写view。
viewWillLayoutSubviews
通知viewcontroller页面即将布局子view。
当视图的边界发生变化时,视图会调整子视图的位置。 您的视图控制器可以覆盖此方法以在视图布局其子视图之前进行更改。 此方法的默认实现不做任何事情。
此方法的调用时机,在viewWillAppear之后,viewDidAppear之前。
viewDidLayoutSubviews
通知viewcontroller页面已经把子view布局完成。
当视图控制器视图的边界改变时,视图调整其子视图的位置,然后系统调用该方法。 但是,调用此方法并不表示视图的子视图的各个布局已调整完成。 因为每个子视图负责调整其自己的布局。
您的视图控制器可以覆盖此方法,以便在视图布局子视图之后进行更改。 此方法的默认实现不做任何事情。
此方法的调用时机,在viewWillAppear之后,viewDidAppear之前。
单个viewController的生命周期
- initWithCoder:(NSCoder *)aDecoder:(如果使用storyboard或者xib)
- loadView:加载view(如果使用storyboard或者xib,不要重写此方法)
- viewDidLoad:view加载完毕
- viewWillAppear:控制器的view将要显示
- viewWillLayoutSubviews:控制器的view将要布局子控件
- viewDidLayoutSubviews:控制器的view布局子控件完成
这期间系统可能会多次调用viewWillLayoutSubviews 、 viewDidLayoutSubviews 俩个方法
- viewDidAppear:控制器的view完全显示
- viewWillDisappear:控制器的view即将消失的时候
- viewDidDisappear:控制器的view完全消失的时候
- 当我们点击push的时候首先会加载下一个界面然后才会调用界面的消失方法
- initWithCoder:(NSCoder *)aDecoder:
ViewController2
(如果用xib创建的情况下) - loadView:
ViewController2(如果使用storyboard或者xib,不会调用此方法)
- viewDidLoad:
ViewController2
- viewWillDisappear:ViewController1 将要消失
- viewWillAppear:
ViewController2
将要出现 - viewWillLayoutSubviews
ViewController2
- viewDidLayoutSubviews
ViewController2
- viewWillLayoutSubviews:ViewController1
- viewDidLayoutSubviews:ViewController1
- viewDidDisappear:ViewController1 完全消失
- viewDidAppear:
ViewController2
完全出现
整个控制器声明周期: viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -> viewWillDisappear -> viewDidDisappear