控制器View的加载 && 创建
loadView
- (void)loadView{
// 系统默认的做法,
[super loadView]
}
- 自定义控制器的view的时候重写这个方法
- 第一次使用控制器的view的时候调用
- 在这个方法中如果没有自定义view,就不能获取控制器的view(
self.view
),不然会死循环 - 第一次用到控制器的view的时候(
self.view
),系统会这样调用getter方法
- (UIView *)view{
if(_view == nil){
[self loadView];
[self viewDidLoad];
}
return _view;
}
- 一旦重写的了这个方法,就不要调用
[super loadView]
, 因为[super loadView]
是系统默认的做法 - 如果重写了这个方法,就不会去加载
storyboard
和xib
描述的控制器的View
控制器View的创建
- 过程
- 如果我们自定义loadView
方法的话,会根据我们的自定义的代码去创建view
,如果没有的话
- 看看有没有storyboard
,如果有的话,根据storyboard
的描述去创建view
,如果没有的话
- 看看有没有通过initWithNibName:bundle:
初始化控制器,如果nibName
不为nil
的话,根据nibName
对应xib
的描述去创建,如果nibName
为nil
的话
- 寻找有没有跟控制器类名同名但是不带Controller
的xib
,如果有的话就会去加载,如果没有的话
- 寻找有没有跟控制器类名同名的xib
,如果有就会去加载,如果没有的话
- 创建空的view
- 注意
- 通过alloc init
创建控制器,如果这个控制器的view
有storyboard
或xib
描述的话,这样创建会自动从storyboard
或xib
加载控制器的View
,其他非控制器控件 alloc init
创建不会自动加载xib
- 因为控制器的init
方法底层会调用initWithNibName:bundle:
- 如果通过xib
加载控制器的view
,在控制器viewDidLoad
方法中拿到的view
的size
是不准确的
- 如果通过storyboard
加载控制器的view
,在控制器viewDidLoad
方法中拿到的view
的size
是准确的(有待验证)
控制器的view懒加载
- 第一次使用的时候才会去加载,并不是创建控制器的时候去加载
- 如果控制器是窗口的根控制器,就可以不用设置控制器view的尺寸