一個關(guān)于loadView的問題,由于平時開發(fā)中對這塊沒注意,現(xiàn)在來分析分析loadView
- 調(diào)用時機:訪問controller的view時,如果view是nil或者說view還沒有加載,loadView方法就會被調(diào)用。
默認的loadView做的事情:
- 如果再初始化controller的時候指定了xib文件名,就會根據(jù)傳入的xib文件名加載對應的xib文件
FirstViewController *controller =
[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
- 如果在創(chuàng)建的時沒有顯式的傳遞xib文件名,就會加載跟controller同名的xib文件
注:在iOS8中,必須顯式的指定xib文件名,不然創(chuàng)建不成功
FirstViewController *controller = [[FirstViewController alloc] init];
- 如果沒有找到相關(guān)聯(lián)的xib文件,就會創(chuàng)建一個空白的UIView。
如果重寫了loadView方法,并沒有給view賦值,下面的例子中viewDidLoad用到self.view時,發(fā)現(xiàn)self.view沒有值,就會調(diào)用loadView,還是沒有值,就會繼續(xù)調(diào)用,會死循環(huán)調(diào)用viewLoad,一直到程序crash。
- (void)loadView {
NSLog(@"loadview ----ffff");
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor grayColor];
}
還有一種導致死循環(huán)的情況,在loadView中調(diào)用self.view,但是此時self.view沒有值,就會自己調(diào)用自己死循環(huán)。
- (void)loadView {
UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view.backgroundColor = [UIColor blueColor];
self.view = view;
}
正確使用姿勢
如果我們想重寫controller的view,就需要重寫loadView,在里面對view進行賦值,此時不要寫[super loadView],因為它會做上面說的那默認的三步。正確的寫法:在loadView中使用view時,確保self.view已經(jīng)有值。
- (void)loadView {
UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view = view;
self.view.backgroundColor = [UIColor blueColor];
}