码迷,mamicode.com
首页 > 其他好文 > 详细

viewDidLoad与initWithNibName的调用时机

时间:2018-02-06 18:05:02      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:完成   load   col   blog   父类   self   color   sub   .text   

加载一个ViewController,我们通常使用init或者initWithNibName方法初始化,但是有的时候会出现一些需要初始化的值没有得到正确的设置,下面给出代码看下实际的效果。

第一种情况:正常初始化

FatherViewController:
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if(self){
        NSLog(@"F_init start ");
        self.FPContent = @"F_我是父类初始化的";
        NSLog(@"F_init end");
    }
    return self;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"F_View");
    NSLog(@"父类的属性值:%@",self.FPContent);
}

SubViewController:
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if(self){
        NSLog(@"S_init start");
        self.FPContent = @"S_我是子类初始化的";
        NSLog(@"S_init end");
    }
    return self;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"S_View");
    NSLog(@"属性值:%@",self.FPContent);
}

执行结果输出如下:

2018-02-06 16:13:07.236401+0800 YYDemo[70368:2809851] F_init start
2018-02-06 16:13:07.236593+0800 YYDemo[70368:2809851] F_init end
2018-02-06 16:13:07.236878+0800 YYDemo[70368:2809851] S_init start
2018-02-06 16:13:07.236967+0800 YYDemo[70368:2809851] S_init end
2018-02-06 16:13:07.411284+0800 YYDemo[70368:2809851] F_View
2018-02-06 16:13:07.411469+0800 YYDemo[70368:2809851] 父类的属性值:S_我是子类初始化的
2018-02-06 16:13:07.411604+0800 YYDemo[70368:2809851] S_View
2018-02-06 16:13:07.411700+0800 YYDemo[70368:2809851] 属性值:S_我是子类初始化的

 

第二种情况:在initWithNibName中调用了viewDidLoad

FatherViewController:
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if(self){
        NSLog(@"F_init start ");
        self.FPContent = @"F_我是父类初始化的";
        NSLog(@"F_init end");
    }
    return self;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"F_View");
    NSLog(@"父类的属性值:%@",self.FPContent);
}

SubViewController:
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if(self){
        NSLog(@"S_init start");
        UILabel *la = [[UILabel alloc] initWithFrame:CGRectMake(88, 20, 100, 20)];
        la.text = self.FPContent;
        [self.view addSubview:la];
        self.FPContent = @"S_我是子类初始化的";
        NSLog(@"S_init end");
    }
    return self;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"S_View");
    NSLog(@"属性值:%@",self.FPContent);
}    

执行结果输出如下:

2018-02-06 16:19:37.594282+0800 YYDemo[71147:2825509] F_init start
2018-02-06 16:19:37.594492+0800 YYDemo[71147:2825509] F_init end
2018-02-06 16:19:37.594592+0800 YYDemo[71147:2825509] S_init start
2018-02-06 16:19:37.718493+0800 YYDemo[71147:2825509] F_View
2018-02-06 16:19:37.718672+0800 YYDemo[71147:2825509] 父类的属性值:F_我是父类初始化的
2018-02-06 16:19:37.718773+0800 YYDemo[71147:2825509] S_View
2018-02-06 16:19:37.718869+0800 YYDemo[71147:2825509] 属性值:F_我是父类初始化的
2018-02-06 16:19:37.719246+0800 YYDemo[71147:2825509] S_init end

 

由以上执行结果可知:

在初始化方法总调用View属性的时候就会调用viewDidLoad方法。

viewDidLoad方法一般在视图树构建完成以后调用一次,但是如果VC的View属性被引用,View为nil 的时候也会调用viewDidLoad方法,提前调动该方法可能就会导致某些值不能得到正确的初始化。

 

viewDidLoad与initWithNibName的调用时机

标签:完成   load   col   blog   父类   self   color   sub   .text   

原文地址:https://www.cnblogs.com/yinyanlyy/p/8422971.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!