- 對于剛開始學習iOS的同學來說,這么多的加載方法看的暈頭轉向,我這個又是強迫癥,整不明白渾身難受.
- 常用的加載方法大概有這么幾個
1.initWithNibName:bundle: (加載帶有XIB控制器)
2.loadView (控制器的View為空的時候調用,幫控制器加載View)
3.initWithCoder: (是當從nib文件中加載對象的時候會調用)
4.awakeFromNib (當.nib文件被加載的時候,會發送一個awakeFromNib的消息到.nib文件中的每個對象)
5.initWithFrame: (代碼創建View時調用,是懶加載,只有到需要顯示時,子控件才不是 nil)
1.讓我們先從ViewController的加載說起
-
Code方式加載ViewController調用的相關方法:
代碼創建的ViewController:
ViewControllerWith *vc = [[ViewControllerWith alloc]init];
在這個加載過程中 相關方法調用順序是:
init
initWithNibName:bundle:
loadView
viewDidLoad
-
XIB的方式加載ViewController調用的相關方法
當command+N創建ViewController的時候勾選了Also create XIB file ,系統就會幫我們創建與ViewController同名的XIB文件
對于這種控制器,常用的創建方式是:
ViewControllerWithXib *vc = [[ViewControllerWithXib alloc]initWithNibName:@"ViewControllerWithXib" bundle:nil];
在這個加載過程中 相關方法調用順序是:
initWithNibName:bundle:
loadView
viewDidLoad
當然, 你也可以以下這種方式創建帶有XIB的ViewController
ViewControllerWithXib *vc = [[ViewControllerWithXib alloc]init];
這樣也能加載出你在xib里面創建的view
前提是你的控制器不能重寫loadView方法
因為用這種方式創建 系統會調用loadVIew幫你尋找和類同名的XIB文件加載
你若是重寫了loadVIew,那么控制器就是漆黑一片
這種方式和代碼創建方式時,函數調用順序一致
-
StoryBoard中加載ViewController調用的相關方法
在StoryBoard中構建好自己的控制器用以下代碼初始化:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"storyboard" bundle:[NSBundle mainBundle]];//這里的bundle 寫nil也可以代表是mainBundle
MyViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
在這個加載過程中 相關方法調用順序是:
initWithCoder:
awakeFromNib
loadView(這個方法結束時 控制器的View的子控件才創建)
viewDidLoad
2.然后是View的加載
-
Code的方式加載View調用的相關方法
View加載的純代碼的方式:
MyView *view = [[MyView alloc]init];
view加贊完畢的時候
在這個加載過程中 相關方法調用順序是:
init
initWithFrame:
是init調用了initWithFrame:
-
XIB的方式加載View調用的相關方法
XIB加載方式:
UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]lastObject];
解析一個文件的時候調用(只是創建了view)
在這個加載過程中 相關方法調用順序是:
initWithCoder:(這個時候子控件沒有被創建)
awakeFromNib(這個時候子控件創建完畢, 一般會在這里進一步對View進行初始化)
感謝閱讀
你的支持是我寫作的唯一動力