美文网首页
控制器的生命周期

控制器的生命周期

作者: 若水water | 来源:发表于2020-04-08 22:24 被阅读0次

首先创建控制器用到以下方法:

  • 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 大小发生改变时,其子视图布局也会相应改变,例如 屏幕旋转,横竖屏适配

参考链接:
https://www.jianshu.com/u/00c07610db8e

相关文章

网友评论

      本文标题:控制器的生命周期

      本文链接:https://www.haomeiwen.com/subject/ukptmhtx.html