欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

控制器loadView方法原理

程序员文章站 2022-07-08 10:48:08
...

loadView底层原理

  1. 先查控制器是否从storyBoard中加载,是则加载控制器的View。
  2. 不是1的方式,查控制器是否从xib中加载,是则加载xib中指定的View。
  3. 不是1、2的方式,则会创建空白的View。

加载xib的控制器

  1. 加载关联xib控制器

viewController:

- (IBAction)btnClick {
    RjqViewController *vc = [[RjqViewController alloc] init];
    [self presentViewController:vc animated:YES completion:^{
        
    }];
}

RjqViewController:

@implementation RjqViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%s",__func__);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(instancetype)init{
    NSLog(@"%s",__func__);
    return [super init];
}

-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    NSLog(@"%s",__func__);
    return [super initWithCoder:aDecoder];
}

-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    NSLog(@"%s",__func__);
    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}

@end

结果:

-[RjqViewController init]
-[RjqViewController initWithNibName:bundle:]
-[RjqViewController viewDidLoad]
  1. 带xib文件,但重写了loadView方法,控制器不会加载xib文件,意味着要自己定义View,如果没有重写loadView,加载xib时会自动调用loadView方法
-(void)loadView{
    NSLog(@"%s",__func__);
    [super loadView];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%s",__func__);
}

结果:视图控制器没有跳转到RjqViewController

-[RjqViewController loadView]
-[RjqViewController viewDidLoad]

在xib中加载视图控制器,self.view是在viewDidAppear中加载完的(frame为屏幕的大小),而不是在viewDidLoad中加载完的(frame为xib的大小),所以self.view的frame大小还没有在viewDidLoad中成型。
不带xib的控制器被加载,viewDidLoad方法中frame的为手机屏幕的大小。

  1. 重写loadView方法加载其他xib文件或改变控制器的视图
-(void)loadView{
    NSLog(@"%s",__func__);
    [super loadView];
    self.view = [[[NSBundle mainBundle] loadNibNamed:@"RjqView" owner:self options:nil] lastObject];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%s",__func__);
}
  1. 控制器的view是懒加载的
-(UIView *)view{
    if(!_view){
        [self loadView];
        [self viewDidLoad];
    }
    return _view;
}