涉及函数
viewDidLoad:当ViewController的view对象载入内存后调用,用于对view进行额外的初始化操作。loadView时还没有view,而viewDidLoad时view已经创建好了。
loadView:每次访问controller的view(比如controller.view、self.view)且view为nil,loadView方法就会被调用。用于创建Controller的View。
viewWillAppear: 视图将要显示
viewWillLayoutSubviews:当一个视图的边界发生变化,也就是调整其子视图的位置。你的视图控制器可以重写此方法在layoutSubViews之前生效以重新布局子视图。该方法的默认实现不执行任何操作。
1、addSubview会触发viewWillLayoutSubviews
2、设置self.view及子视图的frame.size会触发layoutSubviews,当然前提是frame.size的值设置前后发生了变化,注意,此处不是origin,呼应官方文档上的边界发生变化
3、滚动一个UIScrollView(该scrollview有子视图的时候)会触发layoutSubviews
4、横竖屏幕切换会触发
viewDidLayoutSubviews: 控制器的view布局子控件完成
viewDidAppear: 视图已经显示
viewWillDisappear: 视图将要消失
扫描二维码关注公众号,回复:
11877979 查看本文章
viewDidDisappear: 视图已经消失,在Controller被切换时调用,第二个视图出现后第一
VIewController的生命周期
代码显示
//viewcontroller.m
#import "ViewController.h"
#import "secondViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
NSLog(@"viewDidLoad");
UIButton *testButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[self.view addSubview:testButton];
[testButton setFrame:CGRectMake(200, 200, 80, 80)];
[testButton setTitle:@"按钮" forState:UIControlStateNormal];
[testButton addTarget:self action:@selector(press) forControlEvents:UIControlEventTouchUpInside];
}
- (void)loadView{
[super loadView];
NSLog(@"loadView");
}
- (void)viewDidAppear:(BOOL)animated{
NSLog(@"viewDidAppear");
}
- (void)viewDidDisappear:(BOOL)animated{
NSLog(@"viewDidDisappear");
}
- (void)viewWillAppear:(BOOL)animated{
NSLog(@"viewWillAppear");
}
- (void)viewWillDisappear:(BOOL)animated{
NSLog(@"viewWillDisappear");
}
- (void)viewDidLayoutSubviews{
NSLog(@"viewDidLayoutSubviews");
}
- (void)viewWillLayoutSubviews{
NSLog(@"viewWillLayoutSubviews");
}
- (void)press{
secondViewController *secondView = [[secondViewController alloc]init];
secondView.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:secondView animated:YES completion:nil];
}
@end
//secondviewcontroller.m
#import "secondViewController.h"
@interface secondViewController ()
@end
@implementation secondViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
UIButton *back = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[back setTitle:@"返回" forState:UIControlStateNormal];
[back setFrame:CGRectMake(200, 200, 80, 80)];
[self.view addSubview:back];
[back addTarget:self action:@selector(pressBack) forControlEvents:UIControlEventTouchUpInside];
}
- (void)viewDidDisappear:(BOOL)animated {
NSLog(@"secondviewDidDisappear");
}
- (void)viewWillDisappear:(BOOL)animated {
NSLog(@"secondviewWillDisappear");
}
- (void)viewDidAppear:(BOOL)animated {
NSLog(@"secondviewDidAppear");
}
- (void)viewWillAppear:(BOOL)animated {
NSLog(@"secondviewWillAppear");
}
-(void)pressBack{
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
结果
点击第二页按钮后
总结:
- 因为一开始有addSubview一个Button,所以会出现viewWillLayouSubviews;
- 为什么每个viewDidLoad方法中都要使用[super viewDidLoad] ?
父类中的viewDidLoad会帮助你做一些初始化的工作,比如A是基类,B从A继承,B在viewDidLoad方法中创建和初始化了一些成员,C继承B,如果C在调用viewDidLoad的时候没有调用super的viewDidLoad方法,那么就会有一些成员没有被初始化,可能就会产生问题。 - loadView这个方法是系统默认创建的 因为重写了这个方法导致必须要继承其父类的方法,如果不写继承的loadView,无法继承父系的loadview的创建方法,那么就永远无法创建,那么就会陷入循环。