loadView底层原理
- 先查控制器是否从storyBoard中加载,是则加载控制器的View。
- 不是1的方式,查控制器是否从xib中加载,是则加载xib中指定的View。
- 不是1、2的方式,则会创建空白的View。
加载xib的控制器
- 加载关联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]
- 带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的为手机屏幕的大小。
- 重写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__);
}
- 控制器的view是懒加载的
-(UIView *)view{
if(!_view){
[self loadView];
[self viewDidLoad];
}
return _view;
}