一個(gè)關(guān)于loadView的問(wèn)題,由于平時(shí)開發(fā)中對(duì)這塊沒注意枉圃,現(xiàn)在來(lái)分析分析loadView
- 調(diào)用時(shí)機(jī):訪問(wèn)controller的view時(shí),如果view是nil或者說(shuō)view還沒有加載,loadView方法就會(huì)被調(diào)用。
默認(rèn)的loadView做的事情:
- 如果再初始化controller的時(shí)候指定了xib文件名并村,就會(huì)根據(jù)傳入的xib文件名加載對(duì)應(yīng)的xib文件
FirstViewController *controller =
[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
- 如果在創(chuàng)建的時(shí)沒有顯式的傳遞xib文件名,就會(huì)加載跟controller同名的xib文件
注:在iOS8中滓技,必須顯式的指定xib文件名哩牍,不然創(chuàng)建不成功
FirstViewController *controller = [[FirstViewController alloc] init];
- 如果沒有找到相關(guān)聯(lián)的xib文件,就會(huì)創(chuàng)建一個(gè)空白的UIView殖属。
如果重寫了loadView方法姐叁,并沒有給view賦值瓦盛,下面的例子中viewDidLoad用到self.view
時(shí)洗显,發(fā)現(xiàn)self.view沒有值外潜,就會(huì)調(diào)用loadView,還是沒有值挠唆,就會(huì)繼續(xù)調(diào)用处窥,會(huì)死循環(huán)調(diào)用viewLoad,一直到程序crash玄组。
- (void)loadView {
NSLog(@"loadview ----ffff");
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor grayColor];
}
還有一種導(dǎo)致死循環(huán)的情況滔驾,在loadView中調(diào)用self.view,但是此時(shí)self.view沒有值俄讹,就會(huì)自己調(diào)用自己死循環(huán)哆致。
- (void)loadView {
UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view.backgroundColor = [UIColor blueColor];
self.view = view;
}
正確使用姿勢(shì)
如果我們想重寫controller的view,就需要重寫loadView患膛,在里面對(duì)view進(jìn)行賦值摊阀,此時(shí)不要寫[super loadView]
,因?yàn)樗鼤?huì)做上面說(shuō)的那默認(rèn)的三步踪蹬。正確的寫法:在loadView中使用view時(shí)胞此,確保self.view已經(jīng)有值。
- (void)loadView {
UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view = view;
self.view.backgroundColor = [UIColor blueColor];
}