首先创建控制器用到以下方法:
- initWithCoder:(NSCoder*)aDecoder (此方法的前提是用storyboard 或者xib)
- awakeFromNib :xib 初始化后调用(以上方法之后)
- -(instancetype)init ,代码创建(不用storyboard喝 xib ,纯代码)
- loadview:创建控制器的视图
- viewDidload 控制器视图创建完毕
- viewWillAppear:控制器的view将要显示
- viewWillLayoutSobviews:控制器的view将要布局子控件
- viewDidLayoutSubviews:控制器的view布局子控件完成
这期间可能会多次调用viewWillLayoutSobviews,viewDidLayoutSubviews两个方法。 - viewDidAppear 控制器的view完全展示
- viewWillDisappear:控制器的view将要消失
这期间可能也会多次调用viewWillLayoutSobviews,viewDidLayoutSubviews两个方法。 - viewDidDisappear:控制器的view完全消失的时候
多个控制器跳转
控制器A push 控制器 B
- B-> loadview
- B->viewDidLoad
- A->viewWillDisappear
- B->viewWillAppear:
- B->viewWillLayoutSubviews
- B->viewDidLayoutSubviews
- A->viewDidDisappear
- B->viewDidAppear
loadview() 和 viewDidLoad()
- 若控制器有关联的nib 文件,该方法会从nib文件中加载View,如果没有则会创建空白view对象
- loadview 是在控制器view的get方法中调用,如果访问控制器的view,view为空的话 会调用loadview创建
- viewdidload()方法也是在view的get方法中,先调用loadview,然后调用viewdidload,在viewdidload中,如果loadview没有创建view,则会一直调用loadview方法,所以会崩溃
例如:在A控制器中创建按钮,点击事件 跳转到B
- (void)buttonClick {
NextViewController *next = [[NextViewController alloc]init];
next.view.backgroundColor = UIColor.yellowColor;
next.name = @"123";
[self.navigationController pushViewController:next animated:YES];
}
然后在B的loadview方法中 添加如下代码:
- (void)loadView {
UIView *view = [[UIView alloc]initWithFrame:UIScreen.mainScreen.bounds];
view.backgroundColor = UIColor.redColor;
self.view = view;
}
B的 viewDidload中添加如下代码:
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = UIColor.blueColor;
}
猜想:最后B控制器的View的背景颜色是什么?
其实最终的颜色是UIColor.yellowColor。黄色。
因为在A中先调用了next.view.backgroundColor = UIColor.yellowColor;访问了B的View的get方法,所以会先调用 B->loadview 创建View,接着调用B->viewDidload ,之后拿到View ,再设置颜色为UIColor.yellowColor。所以最后呈现的颜色是黄色。
viewWillLayoutSubviews
当view的子视图即将布局时,此方法会被调用,触发的条件是:
- view被添加到视图层次中,(在push 或者present,或者作为跟视图,或者添加到某个父视图中)
- view的bounds发生了改变
- 调用了setNeedsLayout 或者layoutIfNeeded方法
这个方法是写frame 布局代码的好地方,将view的子视图布局好,每次view 大小发生改变时,其子视图布局也会相应改变,例如 屏幕旋转,横竖屏适配
网友评论