美文网首页
UIViewController及其View的加载

UIViewController及其View的加载

作者: 薛定谔的汪汪 | 来源:发表于2018-12-27 12:58 被阅读0次

Part One:(以项目默认的ViewController为例)

(1)当didFinishLaunchingWithOptions:方法中什么也不写时:

image(1)
image(2)
结论:自动加载main.storyboard文件创建ViewController及其view。

(2)当didFinishLaunchingWithOptions:方法中手动写入代码时(main.storyboard未删除):

image.png
结论:如果main.storyboard和手动实现同时存在,优先加载main.storyboard,而后再加载手动实现的代码取代;

(3)当didFinishLaunchingWithOptions:方法中手动写入代码时(main.storyboard已删除):

image.png
结论:自动加载ViewController.xib文件去创建控制器及其view。

(4)当没有ViewController.xib文件时:

image.png
结论:自动加载View.xib文件去创建控制器及其view。

(5)当没有View.xib文件时:

image.png
结论:创建一个透明的(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]方式)

事实上,通过[[ViewController alloc]initWithNibName:nil bundle:nil];方式,两个参数都为nil时,两者等效(也即以上的加载顺序是一样的!只是初始化过程中所走方法不一样) image.png
(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
UIViewController及其View的加载 image.png

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

参考链接:https://www.jianshu.com/p/23a83706d773

相关文章

网友评论

      本文标题:UIViewController及其View的加载

      本文链接:https://www.haomeiwen.com/subject/rtjgcqtx.html