本次博客是一篇總結性質的博客,總結的是各種創建控制器的方式以及一些需要注意的操作。
正如我上一篇博客中所說,當 Main Interface 沒有選定的時候,我們一般只能通過代碼來創建一個 UIWindow,不再使用系統創建好的 Main.storyboard。
通過 storyboard 創建控制器也是在 Main Interface 沒有選定的時候,但是我們還使用系統創建好的 Main.storyboard,通過不同的方法來創建窗口的根控制器。
// 創建窗口 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
初始化方法:
// 參數1:storyboard文件名,不需要帶後綴 // 參數2:置為nil時表示[NSBundle mainBundle] + (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(nullable NSBundle *)storyboardBundleOrNil;
實例代碼:
// 加載storyboard // storyboard文件名,不需要帶後綴,初始化為 Main.storyboard,name就是Main // nil: [NSBundle mainBundle] UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
① 指定箭頭指向的控制器為窗口的根控制器
方法:
// 加載箭頭指向的控制器 - (nullable __kindof UIViewController *)instantiateInitialViewController;
實例代碼:
// 通過storyboard創建控制器 // instantiateInitialViewController:加載箭頭指向的控制器 UIViewController *vc = [storyboard instantiateInitialViewController];
實例圖:
如上圖:我們將粉色背景的控制器設置為默認 Main.storyboard 的控制器,當我們使用上述代碼時,程序運行的效果是:如下圖的一個粉色窗口
② 通過 Storyboard ID 來創建根控制器
方法:
// 參數為:Storyboard ID 的字符串 - (__kindof UIViewController *)instantiateViewControllerWithIdentifier:(NSString *)identifier;
實例代碼:
// 通過 Storyboard ID 創建控制器 UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"green"];
正如 ① 中所示的圖,我們將綠色背景的控制器的 Storyboard ID 置為 "green",但是Main.storyboard 的默認控制器仍然為粉色背景的控制器,使用上述實例代碼,運行結果為如下圖的一個綠色窗口
具體如何設置視圖控制器為 UIWindow 對象的根視圖控制器以及將 UIWindow 對象作為主窗口並可見,請參考上一篇博客。
通過 xib 創建控制器也是在 Main Interface 沒有選定的時候,自己在 AppDelegate.m 文件中對應的方法中先初始化一個 UIWindow 對象。
創建xib的方法:
① 在創建一個視圖控制器的類的時候,將 Also create XIB file 選中之後,就會創建出來一個和控制器類對應的xib,如下圖:
這種方法創建的xib的名字與所對應的類名相同。
② 創建一個名字可以自定義的 xib
創建後的設置:(具體如下圖)
(1)選擇文件所有者選項
(2)綁定控制器
(3)綁定xib視圖
通過xib創建根控制器的方法是一個控制器的初始化方法,實例代碼:
// 通過xib創建控制器 ViewController *vc = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
加載xib的特殊寫法:
// 特殊寫法1: UIViewController *vc = [[ViewController alloc] initWithNibName:nil bundle:nil]; // 特殊寫法2: UIViewController *vc = [[ViewController alloc] init];
以上 xib 的特殊寫法加載 xib View 視圖的底層實現:
如果描述控制器 View 的 xib 跟控制器的類名相同,就會去加載
只有控制器的 init 方法底層會調用 initWithNibName:bundle:
只要通過 initWithNibName:bundle: 初始化控制器,並且 nibName 為 nil ,就會執行以下幾步:
(1)先尋找有沒有跟控制器類名同名但是不帶Controller的xib,如果有就會去加載(XMGView.xib)
(2)如果沒有就尋找有沒有跟控制器類名同名的xib,如果有就會去加載(XMGViewController.xib)
(3)如果都沒有找到,創建空的view,