美文网首页面试iOSiOS开发经验与总结
iOS-控制器View的创建和生命周期

iOS-控制器View的创建和生命周期

作者: xx_cc | 来源:发表于2016-07-31 01:15 被阅读2516次

    1. 控制器View的创建

    首先我们来看一下控制器view创建的流程图


    控制器view加载.jpeg

    从图中我们可以看出,在控制器view加载过程中有两个重要的方法loadView和viewDidLoad。下面我们来重点了解一下这两个方法。

    loadView方法
    作用:loadView方法是用来负责创建UIViewController的view。首先判断下有没有指定storyboard或者xib,如果指定,就会加载它们描述的控制器的view,如果没有指定,创建一个空的view。
    什么时候调用:每次访问UIViewController的view,当view为nil,就会调用loadView方法。

    viewDidLoad
    作用:一般我们会在这里做界面上的初始化操作,比如往view中添加一些子视图等。
    什么时候调用:每当view创建完毕的时候,最终都会调用viewDidLoad方法。

    其次,在view创建过程中还有一些需要注意的地方。

    1. 通过storyboard创建的控制器,或者通过xib创建的控制器的view,系统会帮我们加载控制器的view,具体内部实现可以看iOS-UIWindow详解,在此不在赘述
    1. ViewController *vc = [[ViewController alloc]init];
      底层也会调用-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil方法。
      (1).判断下有没有指定nibName,如果指定了,就会去加载指定的xib
      (2).如果没有指定,就会判断下有没有跟控制器类名同名的xib,有,就会去加载
      (3).判断下有没有跟控制器类名同名的xib,但是后缀不带Controller的xib,如果有,就会去加载
      (4).如果没有任何xib描述控制器的view,就不会加载xib。会创建一个颜色为clearColor的view。

    2. 控制器View的生命周期

    控制器View的生命周期方法

    loadView: 加载view
    viewDidLoad: view加载完毕
    viewWillAppear: 控制器的view将要显示
    viewWillLayoutSubviews: 控制器的view将要布局子控件
    viewDidLayoutSubviews: 控制器的view布局子控件完成
    viewDidAppear: 控制器的view完全显示
    viewWillDisappear: 控制器的view即将消失的时候
    viewDidDisappear: 控制器的view完全消失的时候

    view生命周期方法调用顺序

    viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -> viewWillDisappear -> viewDidDisappear

    3. 控制器View的延迟加载

    控制器的view是延迟加载的:创建控制器并不一定会创建控制器的view,等用到时再加载
    下面我们通过一个小的程序来验证一下
    AppDelegate.m

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        
        self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        // 创建控制器,并一定会创建控制器的view
        ViewController *vc = [[ViewController alloc] init];
        
        vc.view.backgroundColor = [UIColor redColor];
        
        self.window.rootViewController = vc;
        
        [self.window makeKeyAndVisible];
        
        return YES;
    }```
    
    ViewController.m
    

    import "ViewController.h"

    @interface ViewController ()

    @end

    @implementation ViewController

    // 自定义控制器的view

    • (void)loadView
      {
      NSLog(@"%s",func);
      UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
      view.backgroundColor = [UIColor greenColor];
      self.view = view;
      }
      // 控制器的view加载完成的时候调用
    • (void)viewDidLoad {
      [super viewDidLoad];
      // Do any additional setup after loading the view, typically from a nib.
      self.view.backgroundColor = [UIColor blueColor];
      NSLog(@"%s",func);
      }```

    此时打印我们发现控制器的view颜色是红色的,这是因为view的get方法底层中实现了loadView 和 viewDidLoad方法,loadView中将view设置为绿色,viewDidLoad方法中又将view设置成蓝色,但是最后被vc.view.backgroundColor = [UIColor redColor];设置为红色。

    ✨本文借鉴了很多前辈的文章,如果有不对的地方请指正,欢迎大家一起交流学习 xx_cc 。

    相关文章

      网友评论

      本文标题:iOS-控制器View的创建和生命周期

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