一个App有他的生命周期,同样App中的每个控制器也有他的生命周期,所谓控制器的生命周期,就是几个函数的调用顺序。这里,我们以storyboard创建控制器为例,说明说明一下控制器的生命周期。
initWithCoder
- (id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super initWithCoder:aDecoder]) {
NSLog(@initWithCoder Called);
}
return self;
}
viewDidLoad
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@viewDidLoad Called);
// Do any additional setup after loading the view, typically from a nib.
}
viewWillAppear
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
NSLog(@viewWillAppear Called);
}
viewDidAppear
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSLog(@viewDidAppear Called);
}
awakeFromNib
-(void)awakeFromNib{
NSLog(@awakeFromNib Called);
}
viewWillLayoutSubviews
-(void)viewWillLayoutSubviews{
NSLog(@viewWillLayoutSubviews Called);
}
viewDidLayoutSubviews
-(void)viewDidLayoutSubviews{
NSLog(@viewDidLayoutSubviews Called);
}
然后在模拟器上运行,运行结果如下:
initWithCoder Called
awakeFromNib Called
viewDidLoad Called
viewWillAppear Called
viewWillLayoutSubviews Called
viewDidLayoutSubviews Called
viewDidAppear Called
所以,调用顺序为
init函数(init;initWithFrame;initWithCoder;等)--初始化
awakeFromNib--在loadView之前的工作放在这里
viewDidLoad--注意,一个ViewController一个生命周期内这个函数只会调用一次
viewWillAppear -- view将要出现,每次View消失再出现都会调用
viewWillLayoutSubviews--将要对子视图进行布局
viewDidLayoutSubivews--完成对子视图布局
viewDidAppear--视图将要出现在屏幕上
viewWillDisappear--View将要消失
viewDidDisappear--View已经消失
这九个就是通常的视图控制器生命周期内函数调用顺序,一定要清楚什么样的代码应该放在视图控制器生命周期的什么位置