zoukankan      html  css  js  c++  java
  • iOS控制器与视图加载方法

    转载记录, 请看原文:

    1. iOS中的各种加载方法(initWithNibName,loadNibNamed,initWithCoder,awakeFromNib等等)简单使用   http://www.jianshu.com/p/b1352b483d85

    2. initWithNibName与一般init的区别  http://blog.csdn.net/zengraoli/article/details/12882017

    =============

    • 常用的加载方法大概有这么几个
      1.initWithNibName:bundle: (加载带有XIB控制器)
      2.loadView (控制器的View为空的时候调用,帮控制器加载View)
      3.initWithCoder: (是当从nib文件中加载对象的时候会调用)
      4.awakeFromNib (当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象)
      5.initWithFrame: (代码创建View时调用,是懒加载,只有到需要显示时,子控件才不是 nil)

    1.让我们先从ViewController的加载说起

    • Code方式加载ViewController调用的相关方法:

      代码创建的ViewController:

      ViewControllerWith *vc = [[ViewControllerWith alloc]init];

      在这个加载过程中 相关方法调用顺序是:
      init
      initWithNibName:bundle:
      loadView
      viewDidLoad

    • XIB的方式加载ViewController调用的相关方法

      当command+N创建ViewController的时候勾选了Also create XIB file ,系统就会帮我们创建与ViewController同名的XIB文件
      对于这种控制器,常用的创建方式是:

      ViewControllerWithXib *vc = [[ViewControllerWithXib alloc]initWithNibName:@"ViewControllerWithXib" bundle:nil];

      在这个加载过程中 相关方法调用顺序是:
      initWithNibName:bundle:
      loadView
      viewDidLoad

      当然, 你也可以以下这种方式创建带有XIB的ViewController
      ViewControllerWithXib *vc = [[ViewControllerWithXib alloc]init];

      这样也能加载出你在xib里面创建的view
      前提是你的控制器不能重写loadView方法
      因为用这种方式创建 系统会调用loadVIew帮你寻找和类同名的XIB文件加载
      你若是重写了loadVIew,那么控制器就是漆黑一片
      这种方式和代码创建方式时,函数调用顺序一致

    • StoryBoard中加载ViewController调用的相关方法

      在StoryBoard中构建好自己的控制器用以下代码初始化:

        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"storyboard" bundle:[NSBundle mainBundle]];//这里的bundle 写nil也可以代表是mainBundle
        MyViewController *vc = [self.storyboard  instantiateViewControllerWithIdentifier:@"MyViewController"];

      在这个加载过程中 相关方法调用顺序是:
      initWithCoder:
      awakeFromNib
      loadView(这个方法结束时 控制器的View的子控件才创建)
      viewDidLoad

    2.然后是View的加载

      • Code的方式加载View调用的相关方法

        View加载的纯代码的方式:

        MyView *view = [[MyView alloc]init];

        view加赞完毕的时候
        在这个加载过程中 相关方法调用顺序是:
        init
        initWithFrame:
        是init调用了initWithFrame:

      • XIB的方式加载View调用的相关方法

        XIB加载方式:

        UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]lastObject];

        解析一个文件的时候调用(只是创建了view)
        在这个加载过程中 相关方法调用顺序是:
        initWithCoder:(这个时候子控件没有被创建)
        awakeFromNib(这个时候子控件创建完毕, 一般会在这里进一步对View进行初始化)

    =========================

    init只是加载就行,有没有xib无所谓;

    但是initWithNibName需要xib文件,如果该文件不存在则报错:

    网上查看了一下,还有和loadNibNamed的区别和联系,暂时我也没用过这个loadNibNamed

    内容引用自:http://blog.sina.com.cn/s/blog_7b9d64af01018f2u.html

    ===================================================

      关于 initWithNibName 和 loadNibNamed 的区别和联系。之所以要把这两者来一起讲,我觉的我也有点困惑,到底用那种?其实真正搞清楚了他们之间的差别,就不会这么迷惘了。因为这两个方法,根本就不是一路货色。

     

    既然,是要说明这2个方法,那就着重将区别吧。

    但是第一步,还是要罗嗦一下,他们的联系:可以使用此方法加载用户界面(xib文件)到我们的代码中,这样,可以通过操作这个加载进来的(xib)对象,来操作xib文件内容。

     

    下面进入主题,谈区别:

    1. ShowViewController的initWithNibName方法

    ShowViewController* showMessage = [[ShowViewController alloc]

     

                            initWithNibName:@"ShowViewController" bundle:nil];

     

           self.showViewController = showMessage;

     

           [showMessage release];

     

     

     

     

    2.VideoCellController的loadNibNamed方法

    NSArray * nib = [[NSBundle mainBundle]loadNibNamed:@"Save3ViewController" 

                                  owner:self options:nil] ;

    self.showViewController= [nib lastObject];

    [nib objectAtIndex:0];

     

     

    总结:

    只看他们初始化,那可能感觉是一样的。但是如果,打开分别看xib的关系的时候,才恍然大悟,原来他们的集成类都不一样。

    1.initWithNibName要加载的xib的类为我们定义的视图控制器类 

      loadNibNamed要加载的xib的类为NSOjbect。

    (比如:甲,乙都买了一个iPhone,但是,甲的是自己的钱,而乙用的是某某的钱)

     

     

    2.加载方式不同

     initWithNibName方法:是延迟加载,这个View上的控件是 nil 的,只有到 需要显示时,才会不是 nil

    loadNibNamed方法:即时加载,用该方法加载的xib对象中的各个元素都已经存在。

    (认真理解这句帮规:whenusing loadNibNamed:owner:options:, the File's Owner should be NSObject, themain view should be your class type, and all outlets should be hooked up to theview, not the File's Owner.)

     

     

     

    这图配上,上变的图,比翻译中文更加清晰。

     

    谢谢!希望对您有帮助!

    ===================================================

    下面部分转自:http://blog.csdn.net/yanxiaoqing/article/details/7454281

    initWithNibName的初始化问题

    在开发过程中,几次碰到在initWithNibName:nibNameOrNil方法里加载组件或者初始化一些值时,都跟没设置一样,查了一些资料才发现,原来initWithNibName:nibNameOrNil得执行顺序是这样子的

     
    1. supper :  
    2. self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
    3. if (self) {  
    4. set   param=@“supper-A”  
    5. NSLog(@“A-initNIb”);  
    6. }  
    7. viewDIdLoad  
    8. {  
    9. [super viewDidiLoad];  
    10. NSLog(@“A-view”);  
    11. NSLog(param);  
    12. }  
    13.   
    14. sub:  
    15. self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
    16. if (self) {  
    17. set   param=@“sub-B”  
    18. NSLog(@“B-initNIb”);  
    19. }  
    20. viewDIdLoad  
    21. {  
    22. [super viewDidiLoad];  
    23. NSLog(@“B-View”);  
    24. NSLog(param);  
    25. }  


    执行sub时输出顺序:

    A-initNIb   

    A-view

    supper-A

    B-View

    supper-A

    B-initNIb

    sub-initWithNibName: 里调用supper的initWithNibName:

    superclass的initWithNibName方法结束,表示nib文件已加载,则调用sub的 viewDidLoad方法。于是应调用[subclass viewDidLoad]方法。

    subclass的viewDidLoad方法又调用了supclass的viewDidLoad方法。

    最后才是initWithNibName方法剩余的代码

    结论,你在sub里面设置的param=sub-B,并没有起作用输出,因为,在设置之前,sub的view已经执行过了,为了避免这样可以改成

     
    1. sub  
    2. viewDIdLoad  
    3. {  
    4. NSLog(@“B-View”);  
    5. NSLog(param);  
    6. [super viewDidiLoad];  
    7. }  
    8.   
    9. - (void)viewDidLoad{  
    10. [selfsetWords:@” pleaseanswer the door”];  
    11. [super viewDidLoad];  
    12. }  

     ==========================

     
     
  • 相关阅读:
    自用类库整理之SqlHelper和MySqlHelper
    如何设置root登录(滴滴云)
    linux下载命令wget
    linux下查看已经安装的jdk 并卸载jdk
    Angular之constructor和ngOnInit差异及适用场景(转)
    【Spring Boot-技巧】API返回值去除为NULL的字段
    jackson 实体转json 为NULL或者为空不参加序列化
    Android 将Android项目打包成aar文件
    Linux修改war包中文件
    Android 7.0 Gallery图库源码分析4
  • 原文地址:https://www.cnblogs.com/surge/p/6811813.html
Copyright © 2011-2022 走看看