最近在項目里遇到一個問題,加載一個帶有xib的ViewController的時候,用的[[XIBTestViewController alloc] init]方法,沒有指定xib文件,原以為會崩潰或者加載不出來,結果正常加載,并且正常顯示xib的內容。
? ?原來用XIBTestViewController* xibVC=[[XIBTestViewController alloc] init];創建的時候,系統會調用loadVIew方法尋找和類同名的xib文件加載;這里要注意的是不能重寫loadView方法,一旦重寫,就無法自動匹配xib文件加載;
代碼創建ViewController時候:
[[XIBTestViewController alloc] init]
相關方法的調用順序是這樣的:
1.- (id)init;
2.- (id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil;
3.- (void)loadView;
4.- (void)viewDidLoad;
init方法每次也會調用一下initWithNibName
而loadView方法的作用就是為了創建UIViewController的view,創建過程是這樣的:
1.如果在創建ViewController時候指定了xib文件,就加載xib文件來創建UIViewController的view;
2.如果創建ViewController時候沒有指定xib文件,就查找和ViewController同名的xib文件來加載;
3.如果沒指定也沒找到相關聯的xib文件,就創建一個空白view賦值給UIViewController的view;
這就是為什么創建UIViewController時候沒有指定xib文件,也一樣正常加載出來的原因。
? 而loadView方法應該什么時候調用?
- (void)loadView;// This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.
蘋果官方意思就是當在沒有用到xib加載方式且需要自定義自己的view時候可以在這個方法里創建賦值,不應該直接被調用,而是由系統調用;
錯誤用法:[self loadView],不能自己主動調用;
比如不想用系統給默認創建的給ViewController的那個view,那就重寫loadView方法:
- (void)loadView{
???self.view=[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
需要注意的是:重寫loadView方法時候就不需要再調[super loadView]了,因為如果我們重寫了loadView的方法,就代表著我們需要初始化的是自定義的view,而不再是系統默認的view,如果再調用[super loadView]就顯得很多余了。