本次博客是一篇总结性质的博客,总结的是各类建立控制器的方式以及一些须要注意的操做。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,