【iOS】ViewController的生命周期
文章目录
- 概念
- 生命周期
- 函数
- 周期函数的调用顺序
- push/pop
- 运行结果
- 输出
- present/dismiss
- 运行结果
- 输出
概念
在iOS中一般有两种ViewController,一类是用于显示内容的,比如UIViewController,UITableVIewController或者自定义的VC等,另一类是容器型的控制器,如UINavigationController(内部维护一个栈,前面博客中有所讲解,用push,pop进行控制),UITabBarController(内部维护一个数组)等
内容型 VC = 页面本身(展示内容和逻辑)
容器型 VC = 用来管理多个内容 VC 的关系(栈 or 数组)
生命周期
函数
- init:初始化程序
- loadView:在UIViewController对象的view被访问且为空时调用
- viewDidLoad:视图加载完成后调用,进行如控件的初始化之类的操作,在这个控制器销毁之前只会调用一次该方法
- viewWillAppear:视图即将展现时调用
- viewWillLayoutSubviews:即将开始子视图位置布局
- viewDidLayoutSubviews:用于通知视图的位置布局已经完成
- viewDidAppear:视图已经出现时调用
- viewWillDisappear:视图即将消失
- viewDidDisappear:视图已经消失
- dealloc:视图被销毁
周期函数的调用顺序
我们具体调用控制器推出另一个控制器时的具体方法有两种,一个是push方法,另一个是present方法,他们的具体调用顺序调用我们在下面演示一下
push/pop
#import "ViewControllerA.h"
#import "ViewControllerB.h"
@interface ViewControllerA ()
@property (nonatomic, strong) UIButton *pushButton;
@end@implementation ViewControllerA- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor blueColor];self.title = @"ViewController A";NSLog(@"A - %s", __func__);_pushButton = [UIButton buttonWithType:UIButtonTypeSystem];[_pushButton setTitle:@"Push to B" forState:UIControlStateNormal];_pushButton.frame = CGRectMake(self.view.frame.size.width / 2 - 100, 200, 200, 50);_pushButton.backgroundColor = [UIColor whiteColor];[self.view addSubview:_pushButton];[_pushButton addTarget:self action:@selector(pushViewControllerB) forControlEvents:UIControlEventTouchUpInside];
}- (void)pushViewControllerB {ViewControllerB *b = [[ViewControllerB alloc] init];NSLog(@"-------- A push B --------");[self.navigationController pushViewController:b animated:YES];
}
- (void)loadView {[super loadView];NSLog(@"A - %s", __func__);
}- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];NSLog(@"A - %s", __func__);
}- (void)viewWillLayoutSubviews {[super viewWillLayoutSubviews];NSLog(@"A - %s", __func__);
}- (void)viewDidLayoutSubviews {[super viewDidLayoutSubviews];NSLog(@"A - %s", __func__);
}- (void)viewDidAppear:(BOOL)animated {[super viewDidAppear:animated];NSLog(@"A - %s", __func__);
}- (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:animated];NSLog(@"A - %s", __func__);
}- (void)viewDidDisappear:(BOOL)animated {[super viewDidDisappear:animated];NSLog(@"A - %s", __func__);
}
#import "ViewControllerB.h"@interface ViewControllerB ()
@property (nonatomic, strong) UIButton *popButton;
@end@implementation ViewControllerB- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor redColor];self.title = @"ViewController B";NSLog(@"B - %s", __func__);// Pop 按钮_popButton = [UIButton buttonWithType:UIButtonTypeSystem];[_popButton setTitle:@"Pop to A" forState:UIControlStateNormal];_popButton.frame = CGRectMake(self.view.frame.size.width / 2 - 100, 200, 200, 50);_popButton.backgroundColor = [UIColor whiteColor];[self.view addSubview:_popButton];[_popButton addTarget:self action:@selector(popToViewControllerA) forControlEvents:UIControlEventTouchUpInside];
}- (void)popToViewControllerA {NSLog(@"-------- B pop A --------");[self.navigationController popViewControllerAnimated:YES];
}
- (void)loadView {[super loadView];NSLog(@"B - %s", __func__);
}- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];NSLog(@"B - %s", __func__);
}- (void)viewWillLayoutSubviews {[super viewWillLayoutSubviews];NSLog(@"B - %s", __func__);
}- (void)viewDidLayoutSubviews {[super viewDidLayoutSubviews];NSLog(@"B - %s", __func__);
}- (void)viewDidAppear:(BOOL)animated {[super viewDidAppear:animated];NSLog(@"B - %s", __func__);
}- (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:animated];NSLog(@"B - %s", __func__);
}- (void)viewDidDisappear:(BOOL)animated {[super viewDidDisappear:animated];NSLog(@"B - %s", __func__);
}
运行结果
输出
present/dismiss
#import "ViewControllerA.h"
#import "ViewControllerB.h"@interface ViewControllerA ()
@property (nonatomic, strong) UIButton *presentButton;
@end@implementation ViewControllerA- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor blueColor];self.title = @"ViewController A";NSLog(@"A - %s", __func__);_presentButton = [UIButton buttonWithType:UIButtonTypeSystem];[_presentButton setTitle:@"Present B" forState:UIControlStateNormal];_presentButton.frame = CGRectMake(self.view.frame.size.width / 2 - 100, 200, 200, 50);_presentButton.backgroundColor = [UIColor whiteColor];[self.view addSubview:_presentButton];[_presentButton addTarget:self action:@selector(presentViewControllerB) forControlEvents:UIControlEventTouchUpInside];
}- (void)presentViewControllerB {ViewControllerB *b = [[ViewControllerB alloc] init];NSLog(@"-------- A present B --------");b.modalPresentationStyle = UIModalPresentationFullScreen;[self presentViewController:b animated:YES completion:nil];
}
- (void)loadView {[super loadView];NSLog(@"A - %s", __func__);
}- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];NSLog(@"A - %s", __func__);
}- (void)viewWillLayoutSubviews {[super viewWillLayoutSubviews];NSLog(@"A - %s", __func__);
}- (void)viewDidLayoutSubviews {[super viewDidLayoutSubviews];NSLog(@"A - %s", __func__);
}- (void)viewDidAppear:(BOOL)animated {[super viewDidAppear:animated];NSLog(@"A - %s", __func__);
}- (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:animated];NSLog(@"A - %s", __func__);
}- (void)viewDidDisappear:(BOOL)animated {[super viewDidDisappear:animated];NSLog(@"A - %s", __func__);
}/*
#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/@end
#import "ViewControllerB.h"@interface ViewControllerB ()
@property (nonatomic, strong) UIButton *dismissButton;
@end@implementation ViewControllerB- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor redColor];self.title = @"ViewController B";NSLog(@"B - %s", __func__);_dismissButton = [UIButton buttonWithType:UIButtonTypeSystem];[_dismissButton setTitle:@"Dismiss to A" forState:UIControlStateNormal];_dismissButton.frame = CGRectMake(self.view.frame.size.width / 2 - 100, 200, 200, 50);_dismissButton.backgroundColor = [UIColor whiteColor];[self.view addSubview:_dismissButton];[_dismissButton addTarget:self action:@selector(dismissToViewControllerA) forControlEvents:UIControlEventTouchUpInside];
}- (void)dismissToViewControllerA {NSLog(@"-------- B dismiss A --------");[self dismissViewControllerAnimated:YES completion:nil];
}- (void)loadView {[super loadView];NSLog(@"B - %s", __func__);
}- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];NSLog(@"B - %s", __func__);
}- (void)viewWillLayoutSubviews {[super viewWillLayoutSubviews];NSLog(@"B - %s", __func__);
}- (void)viewDidLayoutSubviews {[super viewDidLayoutSubviews];NSLog(@"B - %s", __func__);
}- (void)viewDidAppear:(BOOL)animated {[super viewDidAppear:animated];NSLog(@"B - %s", __func__);
}- (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:animated];NSLog(@"B - %s", __func__);
}- (void)viewDidDisappear:(BOOL)animated {[super viewDidDisappear:animated];NSLog(@"B - %s", __func__);
}/*
#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/@end
运行结果
输出