美文网首页
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内部实现逻辑

    1 loadView方法作用 创建控制器的view第一次使用控制器View的时候调用,在控制器View的get方法...

  • RunLoop内部实现逻辑

    其内部代码整理如下 :可以看到,实际上 RunLoop 就是这样一个函数,其内部是一个 do-while 循环。当...

  • 各算子库对卷积的支持

    算子库使用语言卷积内部实现逻辑OpenBlasC无卷积算子实现MKLC++1. 内部自己实现,矩阵乘法使用gemm...

  • 微服务测试

    Api内部业务逻辑(稳定) 1.接口功能实现的完整度 2.内部逻辑 3.异常处理 单元测试(类)----开发 组件...

  • [Java]重学Java-内部类

    什么是内部类 一个类中定义了另一个类,被定义的类叫作内部类。内部类可以将逻辑隐藏,使用好修饰符可以让实现逻辑对外隔...

  • 支付宝成都面试题

    题目:编写2个用户之间的转账接口及其内部实现? 要求:完成接口设计、并实现其内部逻辑,以完成A用户转账给B用户的功...

  • UIViewController的知识

    1、loadView 创建一个view,在viewDidload之前调用,同时这个方法内部还调用了viewDid...

  • 微服务项目目录结构

    单个服务内分为以下几个模块: 服务接口 api为其他服务提供内部调用接口 服务实现 service实现业务逻辑实现...

  • 第三方分享流程整理

    成员 shareSDK:外部分享调用的接口shareServiceManager:内部底层逻辑的实现者 注册 注册...

  • UIViewController loadView view

    loadView 开发者编码实现,函数中 self.view = yourVIew.. viewDidLoad已经...

网友评论

      本文标题:loadView内部实现逻辑

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