Part One:(以项目默认的ViewController为例)
(1)当didFinishLaunchingWithOptions:方法中什么也不写时:


结论:自动加载main.storyboard文件创建ViewController及其view。
(2)当didFinishLaunchingWithOptions:方法中手动写入代码时(main.storyboard未删除):

结论:如果main.storyboard和手动实现同时存在,优先加载main.storyboard,而后再加载手动实现的代码取代;
(3)当didFinishLaunchingWithOptions:方法中手动写入代码时(main.storyboard已删除):

结论:自动加载ViewController.xib文件去创建控制器及其view。
(4)当没有ViewController.xib文件时:

结论:自动加载View.xib文件去创建控制器及其view。
(5)当没有View.xib文件时:

结论:创建一个透明的(clearColor)View
总结:
(1)应用启动时,控制器及其view的自动优先级为:
Main.storyboard > ViewController.xib > View.xib > clearColor(alloc]init]方式)
(2)当[[ViewController alloc]init]初始化时对view的自动加载顺序为:ViewController.xib > View.xib > clearColor(alloc]init]方式)

(3)无论是storyboard文件还是xib文件,它们对view的创建与加载都是在-loadView中完成的,该方法之后的方法中所做的事情都会有所体现。
(4)【控制器】的初始化方式有两种:【【xxx alloc】init】与xib/storyboard,两种方式所走方法不同。
storyboard:会先后走initWithCoder:、awakeFromNib方法
指定xib方式:只调用initWithNibName:bundle:方法
【【xxx alloc】init】:会先后走initWithNibName:bundle:和init方法
⚠️:无论是通过指定xib名字方式还是通过【【xxx alloc】init】方式,初始化控制器时都不走initWithCoder:、awakeFromNib!!!(额。这两个是Xib创建UIView时初始化和初始化完成后调用的方法)
⚠️:UIViewController有两个指定的【特有的】初始化方法:
image.png
(1)initWithNibName:bundle:
//该方法用于以xib方式来初始化控制器。
(2)initWithCoder:
//当通过storyboard方式初始化控制器时自动调用该方法。(xib方式暂时未知,实验时不走。。。)
⚠️:UIViewController继承于UIResponder,UIResponder又继承于NSObject,作为基类,它有init方法用于实例化一个类的实例。因而UIViewController也有该实例化方法,这就是最常见的
ViewController *vc = [[ViewController alloc]init];
无论是通过initWithNibName:bundle:方法还是通过init方法实例化UIViewController,最终都会调用initWithNibName:bundle:方法;当两种方法都存在时:先调用initWithNibName:bundle:再调用init方法;
ViewController *vc = [[ViewController alloc]init];
//先调用initWithNibName:bundle:再调用init方法;
ViewController *svc = [[ViewController alloc]initWithNibName:@"ViewController" bundle:nil];
//只走initWithNibName:bundle:方法;
有两种方法可以加载XIB中的UIView(视图),区别如下:
initWithNibName方法:是延迟加载,这个View上的控件是 nil 的,只有到需要显示时,才会不是 nil ;
loadNibNamed方法:即时加载,用该方法加载的xib对象中的各个元素都已经存在。
Part Two: (以普通控制器的加载为例)
控制器view的加载
1.通过指定storyboard名字加载SecondViewController及其view
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil];
SecondViewController *svc1 = [sb instantiateInitialViewController];[self presentViewController:svc1 animated:YES completion:nil];
//结论:按指定的【storyboard名】加载控制器及其view!
2.通过加载【指定的xib名】来加载SecondViewController及其view
SecondViewController *svc2 = [[SecondViewController alloc]initWithNibName:@"OtherViewController" bundle:nil];
[self presentViewController:svc2 animated:YES completion:nil];
//结论:按指定的【xib】名加载控制器及其view!
3.不指定xib文件名的情况下加载SecondViewController及其view
SecondViewController *svc3 = [[SecondViewController alloc]init];
[self presentViewController:svc3 animated:YES completion:nil];
//结论:系统默认加载与控制器同名的【SecondViewController.xib】文件
4.当没有SecondViewController.xib文件时:
SecondViewController *svc4 = [[SecondViewController alloc]init];
[self presentViewController:svc4 animated:YES completion:nil];
//结论:系统默认加载【SecondView】.xib文件
5.当SecondView.xib文件时:
SecondViewController *svc5 = [[SecondViewController alloc]init];
[self presentViewController:svc5 animated:YES completion:nil];
//结论:系统默认加载【clearColor】(透明)的view
//1.通过指定storyboard名字加载SecondViewController及其view
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil];
SecondViewController *svc1 = [sb instantiateInitialViewController];
[self presentViewController:svc1 animated:YES completion:nil];
//结论:按指定的【storyboard名】加载控制器及其view!
//2.通过加载【指定的xib名】来加载SecondViewController及其view
SecondViewController *svc2 = [[SecondViewController alloc]initWithNibName:@"OtherViewController" bundle:nil];
[self presentViewController:svc2 animated:YES completion:nil];
//结论:按指定的【xib】名加载控制器及其view!
//3.不指定xib文件名的情况下加载SecondViewController及其view
SecondViewController *svc3 = [[SecondViewController alloc]init];
[self presentViewController:svc3 animated:YES completion:nil];
//结论:系统默认加载与控制器同名的【SecondViewController.xib】文件
//4.当没有SecondViewController.xib文件时:
SecondViewController *svc4 = [[SecondViewController alloc]init];
[self presentViewController:svc4 animated:YES completion:nil];
//结论:系统默认加载【SecondView】.xib文件
//5.当SecondView.xib文件时:
SecondViewController *svc5 = [[SecondViewController alloc]init];
[self presentViewController:svc5 animated:YES completion:nil];
//结论:系统默认加载【clearColor】(透明)的view


⚠️:以上加载过程都是在未重写-(void)loadView;方法时的加载顺序;如果重写了-(void)loadView;的方法,则按照重写的方式加载控制器view。
网友评论