本次博客是一篇總結性質的博客,總結的是各類建立控制器的方式以及一些須要注意的操做。app
正如我上一篇博客中所說,當 Main Interface 沒有選定的時候,咱們通常只能經過代碼來建立一個 UIWindow,再也不使用系統建立好的 Main.storyboard。ide
經過 storyboard 建立控制器也是在 Main Interface 沒有選定的時候,可是咱們還使用系統建立好的 Main.storyboard,經過不一樣的方法來建立窗口的根控制器。spa
// 建立窗口 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
初始化方法:code
// 參數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];
① 指定箭頭指向的控制器爲窗口的根控制器blog
方法:字符串
// 加載箭頭指向的控制器 - (nullable __kindof UIViewController *)instantiateInitialViewController;
實例代碼:博客
// 經過storyboard建立控制器 // instantiateInitialViewController:加載箭頭指向的控制器 UIViewController *vc = [storyboard instantiateInitialViewController];
實例圖:it
如上圖:咱們將粉色背景的控制器設置爲默認 Main.storyboard 的控制器,當咱們使用上述代碼時,程序運行的效果是:以下圖的一個粉色窗口io
② 經過 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,