UIWindow - 05LoadView浅谈

  • loadView 是干嘛用得?
    • 第一次使用控制器view的时候,会调用loadView方法
    • loadView方法干什么用? 创建UIView得,创建控制器内部的view.
  • 系统的loadView做了哪些操作
    • 当前控制器是否从StoryBaord 文件当中加载。如果是:
      self.view = stroyboard 当中控制器的view
    • 是否从xib 文件来描述控制器的View。如果是:
      self.view = xib指定的view
    • 如果都不是,创建一个新的UIView
      self.view = [[UIView alloc]init]
  • 注意:
    子类一旦重写了- loadView方法,系统的- loadView 方法就失效了。(就不会自动去创建UIView了)
    重点: 即使在自定义- loadView方法里面写[super loadView],也不会自动去创建UIView了
    -- 只要重写了"loadView 方法", 就不会去指定"Xib 文件"/"StoryBaord 文件"里面的"UIView"
    -- 所以,下面代码显示的是"红色的UIView",即使是"Xib / StoryBoard文件"里面的"UIView是其他颜色"。
    - (void)loadView{
      UIView * huhVeiw = [[UIView alloc]init];
      huhVeiw.backgroundColor = [UIColor redColor];
      self.view  = huhVeiw;
    }
    -- 即使是"[super loadView]"也不会去指定/创建"UIView"。
    
  • 控制器的View的get方法,做了什么事情?
    • 控制器的View懒加载方法(用到时加载,且只加载一次)
    • 控制器的View,内部调用了-loadView 方法来创建控制的 UIView
    • 模拟控制器View的懒加载
      -(UIView *)view{
        if (_view == nil) {
          [self loadView];
          -- 控制器加载完成时,会调用"viewDidLoad方法"
         [self viewDidLoad];
        }
        return _view;
      }
      
  • 什么时候使用控制器的view ?
    也就说,什么时候调用- loadView 方法?
    • makeKeyAndVisible 方法包含了,把控制的view,添加到窗口的操作。
    • 获取控制器的view的时候,调用了- getView方法
      rootViewController.view

  • 其他概念:
    • 每个控制器都有个UIView。
    • 系统的UIView,默认是没有值得.
    • 注意一个死循环,在loadView 方法里面调用self.view
      - "self.view" - 调用"getView方法"
      - "getView方法" - 内部会调用"loadView 方法"
      - "loadView 方法" - 如果里面有"self.view",那么就变成了"死循环了"
      
      - (void)loadView{
        NSLog(@"%@",self.view);
       }
      -- 此代码也会 "死循环"。
      - (void)loadView{
         UIView * huhVeiw = [[UIView alloc]initWithFrame:self.view.frame];
       }
      
      
      下面代码, 不会死循环
      -- self.view = huhVeiw; 调用的是"setView 方法" (不是"getView 方法")
      -- NSLog(@"%@",self.view); 调用的是"getView 方法",但是,此时的view,已经有值了。
         所以,在"getView 方法"里,不会再去调用"loadView 方法",也就不会"死循环"。
      
      - (void)loadView{
        UIView * huhVeiw = [[UIView alloc]init];
        huhVeiw.backgroundColor = [UIColor redColor];
        self.view = huhVeiw;
        NSLog(@"%@",self.view);
      }
      
      -(UIView *)view{
        if (_view == nil) {
            [self loadView];
          }
          return _view;
        }
      

  • 有趣的测试
     loginVC.view.backgroundColor = [UIColor greenColor];
    
    - (void)loadView{
      UIView * huhVeiw = [[UIView alloc]init];
      huhVeiw.backgroundColor = [UIColor redColor];
      self.view = huhVeiw;
    }
    -- 这时候,显示的是红色的view,还是绿色的view ?
    答: 绿色的view!
        因为在"loginVC.view"的时候就会去调用,"getView方法" --> "loadView方法"。
        在"loadView方法"里,将view的颜色变为红色,接着返回到"loginVC.view.backgroundColor 方法"
        把"红色的view",改为"绿色的view"。
    
    测试二
    - 在上面代码的基础上,在增加一个"viewDidLoad 方法", 问最后view的背景颜色是"红色, 绿色, 还是蓝色"?
    答: 是绿色背景的View
        "loginVC.view"之后, view的颜色是"红色"。然后立马加载"viewDidLoad 方法", view的颜色是"蓝色"。
        最后返回,执行"loginVC.view.backgroundColor 方法",view的背景色是"绿色" 。
    
     - (void)viewDidLoad {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor blueColor]; //蓝色
    }
    
    -(UIView *)view{
    if (_view == nil) {
        [self loadView];
        -- 控制器加载完成时,会调用"viewDidLoad方法"
       [self viewDidLoad];
      }
      return _view;
    }
    

你可能感兴趣的:(UIWindow - 05LoadView浅谈)