美文网首页
loadView内部实现逻辑

loadView内部实现逻辑

作者: 丹丹十个胆小鬼 | 来源:发表于2018-12-21 09:27 被阅读0次

    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内部实现逻辑

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