loadView内部实现逻辑

1 loadView方法作用

创建控制器的view
第一次使用控制器View的时候调用,在控制器View的get方法中调用(使用的是懒加载
当外界第一个使用当前控制器的View时,会调用当前一个方法loadView,创建控制器的View, 控制器的View是懒加载的,什么时候使用,什么时候才去创建,如果已经创建,就不会再创建了。
默认控制器View背景颜色是[UIColor clearColor]

2 loadView内部实现

首先会判断当前控制器是否从StoryBoard中加载,如果是,直接加载,如果不是,再判断有没有Xib来描述控制器的View,如果有,从Xib中加载,如果没有,loadView会直接通过[[UIView alloc] init]来创建。

1.png

注意:一但重写了loadView,就代表控制器的View有自己来创建,重写[super loadView]也不行.

3 loadView和viewDidLoad关联

viewDidLoad方法系统是在控制器view加载完毕后运行一次,那他们是否有这一定的关联呢?
先来看下一个简单的demo:


2.png

UIApplicationDelegate加载完毕的代理方法中,用代码创建根控制器,并设置控制器view背景色为红色:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    
    FLTestViewCtr *testVc = [[FLTestViewCtr alloc] init];
    // 设置控制器view背景颜色为红色
    testVc.view.backgroundColor = [UIColor redColor];
    
    self.window.rootViewController = testVc;
    
    [self.window makeKeyAndVisible];
    return YES;
}

FLTestViewCtr中重写loadView,自己来创建控制器view,并在viewDidLoad方法中设置控制器view的背景颜色为黄色:


- (void)loadView {
    UIView *view = [[UIView alloc] init];
    view.backgroundColor = [UIColor blueColor];
    self.view = view;
}


- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor yellowColor];
    // Do any additional setup after loading the view from its nib.
}

运行demo,显示出来的控制器会是什么颜色呢?

答案是红色,不是黄色,更不会是蓝色!

首先demo中第一次调用控制器的view是在应用加载完毕的回调方法中:

 // 设置控制器view背景颜色为红色
    testVc.view.backgroundColor = [UIColor redColor];

这里第一次使用控制器view开始是没值的,会先调用loadview方法去创建控制区view,但是它是怎么和loadview方法关联的呢?
答案是控制器view的get方法(view创建也是用的懒加载),在view的get方法中调用了loadview,调用完loadview方法后,会接着调用viewDidLoad方法,然后getView方法才会返回本次懒加载生成的控制器view,所以你在loadViewviewDidLoad方法中设置view颜色,并不是最后的颜色!

用伪代码描述如下:

//作用:创建控制器的View.
//什么时候调用,第一个使用控制器View时调用. 在控制器View的get方法调用 get方法是懒加载的
- (UIView *)view {

    if (_view == nil) {

        [self loadView];
        [self viewDidLoad];
    }
    return _view;

}

你可能感兴趣的:(loadView内部实现逻辑)