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

1. 控制器View的创建

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


iOS-控制器View的创建和生命周期_第1张图片
控制器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的创建和生命周期)