转载记录, 请看原文:

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. sub:
  14. self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  15. if (self) {
  16. set   param=@“sub-B”
  17. NSLog(@“B-initNIb”);
  18. }
  19. viewDIdLoad
  20. {
  21. [super viewDidiLoad];
  22. NSLog(@“B-View”);
  23. NSLog(param);

执行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. - (void)viewDidLoad{
  8. [selfsetWords:@” pleaseanswer the door”];
  9. [super viewDidLoad];
  10. }

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

转载于:https://www.cnblogs.com/surge/p/6811813.html

iOS控制器与视图加载方法相关推荐

  1. iOS开发之控制器创建与加载(生命周期)

    1.如何创建一个控制器 控制器常见的创建方式有以下几种: (1)通过storyboard创建 (2)直接创建 MJViewController *mj = [[MJViewController all ...

  2. Swift - 使用addSubview()方法将StoryBoard中的视图加载进来

    使用 Storyboard 我们可以很方便地搭建好各种复杂的页面,同时通过 segue 连接可以轻松实现页面的跳转. 但除了segue,我们还可以使用纯代码的方式实现Storyboard界面的跳转. ...

  3. iOS之深入了解控制器View的加载

    前言 在面试中,面试官可能会问这样的问题,loadView有什么作用,它与viewDidLoad有何区别? 首先我们得知道,控制器view是通过懒加载的方式进行加载的,即用到的时候再加载. loadV ...

  4. 视图加载时自动执行铵钮事件

    再学习一个方法,就是在ASP.NET MVC视图加载时,让jQuery自动执行一个铵钮事件. 在控制器添加一个Action操作: 先在视图实现一个铵钮事件: 看看上面运行时的效果,当视图加载时,需要人 ...

  5. 【iOS开发】-UIViewController加载过程和生命周期

    文章目录 前言 ViewController执行过程的探讨 ViewControllerOne 函数介绍 顺序引入 ViewControllerSecond引入 ViewControllerOne点击 ...

  6. java web配置dll文件_JavaWeb项目中dll文件动态加载方法解析(详细步骤)

    相信很多做Java的朋友都有过用Java调用JNI实现调用C或C++方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢.今天就给大家带来一篇JAVA Web项目中DLL/SO ...

  7. xib文件的加载方法

    xib文件的加载方法 以UITableViewCell的cell为例 很多时候因为系统的cell无法满足我们的日常需求,我们都会自定义cell 因为cell的界面比较固定,所以通常都会选择用xib来描 ...

  8. react路由按需加载方法

    使用router4之后以前的按需加载方法require.ensure 是不好使了. 所以我们改用react-loadable插件做按需加载. 第一步: yarn add react-loadable ...

  9. IOS使用pods初次加载出现Pods-resources.sh: Permission denied错误的解决方案

    IOS使用pods初次加载出现Pods-resources.sh: Permission denied错误的解决方案 参考文章: (1)IOS使用pods初次加载出现Pods-resources.sh ...

最新文章

  1. 655. Print Binary Tree 解题报告(树)
  2. Hystrix熔断器机制
  3. spring 构造函数注入_Spring构造函数注入和参数名称
  4. 基础IO(文件接口、安装内核源码超详细步骤图解、静态库与动态库)
  5. Python+常用模块(2).md
  6. 伪验证码(含随机验证码方法)js+css
  7. 冒泡排序和选择排序的实现与比较
  8. ApolloStudio高手之路(12):机器视觉图像匹配定位与激光打标领域深度结合(基于海康威视VisionMaster九点标定、模板快速匹配定位、标定转换以及金橙子EzCad2二次开发)
  9. 红外热成像仪原理及应用
  10. 计算机在未来土木工程领域的作用,CAD在土木工程领域中的应用策略
  11. 【历史上的今天】9 月 9 日:C 语言之父诞生;阿里巴巴成立
  12. 征文 | 青出于蓝而胜于蓝 国货之光GBase
  13. ps制作公章教程,沿着圆圈打字,斑驳效果
  14. HTML5--2 HTML标签
  15. git 不abandon的办法
  16. 删库跑路(错误0x80070091:目录不是空的)该如何解决???还是别解决了。。。
  17. 听说CDN高防和高防IP是服务器安全的“翘楚”,那么你知道这二者的区别吗?
  18. 20210215 Cobalt Strike 重定器/转发器/红队反溯源手段
  19. 第五十八章 SQL函数 FLOOR
  20. C/C++常用计时函数

热门文章

  1. Oracle SGA优化
  2. freemarker结合springMVC配置
  3. 科研人看过来!2021腾讯AI Lab犀牛鸟专项研究计划开始申请
  4. CVPR 2020丨基于范例的精细可控图像翻译CoCosNet,一键生成你心目中的图像
  5. 韩国ETRI提出实时Anchor-Free实例分割算法CenterMask,代码将开源
  6. 中科院自动化所目标跟踪论文整理!三篇综述、两篇ICCV 2019!
  7. 【Python】Python实战从入门到精通之七 -- 教你深入理解异常处理
  8. spring的事务隔离_spring事务基础及常见问题详解
  9. MYSQL 数据库怎样快速的复制表以及表中的数据
  10. OOA OOD OOP