关于 initWithNibName 和 loadNibNamed 的区别和联系
2015-10-13 12:46
447 查看
关于 initWithNibName 和 loadNibNamed 的区别和联系。之所以要把这两者来一起讲,我觉的我也有点困惑,到底用那种?其实真正搞清楚了他们之间的差别,就不会这么迷惘了。因为这两个方法,根本就不是一路货色。
既然,是要说明这2个方法,那就着重将区别吧。
但是第一步,还是要罗嗦一下,他们的联系:可以使用此方法加载用户界面(xib文件)到我们的代码中,这样,可以通过操作这个加载进来的(xib)对象,来操作xib文件内容。
下面进入主题,谈区别:
1. ShowViewController的initWithNibName方法
2.VideoCellController的loadNibNamed方法
总结:
只看他们初始化,那可能感觉是一样的。但是如果,打开分别看xib的关系的时候,才恍然大悟,原来他们的集成类都不一样。
1). initWithNibName要加载的xib的类为我们定义的视图控制器类
loadNibNamed要加载的xib的类为NSOjbect。
(比如:甲,乙都买了一个iPhone,但是,甲的是自己的钱,而乙用的是某某的钱)
2).加载方式不同
initWithNibName方法:是延迟加载,这个View上的控件是 nil 的,只有到 需要显示时,才会不是 nil
loadNibNamed方法:即时加载,用该方法加载的xib对象中的各个元素都已经存在。
(认真理解这句帮规:when using loadNibNamed:owner:options:, the File's Owner should be NSObject, the main view should be your class type, and all outlets should be hooked up to the view, not the File's Owner.)
3.再来详细讲解一下loadNibNamed
1、loadNibNamed方法:
参数:
name:nib文件的名称
owner:指定name参数所指代的nib文件的File's Owner
options:当nib文件开始时,需要的数据
返回值:返回符合对象的数组。
例子:初始化一个View
在这个时候生成后会让引用计数器变为1,但是需要注意得,owner:self ,在owner自己dealloc得时候,系统会自动帮你将你自定义view引用计数器-1得。
特别注意:
loadNibNamed:owner:options: 这个函数会返回一个nib的数组。不过,在iPhone2.1包括以后的版本,这个数组的第一个元素,即nib[0]表示的就是除了File‘s Owner 和 File Responder后的第一个东西。在iPhon2.1之前的版本,nib[0]是File's Owner,nib[1]才是除了File‘s Owner 和 File Responder后的第一个东西。
例子:
一个继承UIView的类
图1
图2
在objects一栏中设置LoadView.xib的class为要创建的类型( 这里是LoadView.h)
然后调用[[NSBundle mainBundle]loadNibNamed:@"LoadView" owner:self options:nil],这里的owner参数无所谓,随便设置,(猜测)因为我的xib文件中没有对File‘s Owner的Outlets进行关联。
使用数组对象接收:NSArray *nib=[[NSBundle mainBundle] loadNibNamed:@"LoadView" owner:self options:nil];
数组中的元素是图2中Objects一栏中的元素,注意,这里并没有包含LoadView中的节点元素,所以Objects个数是2,即nib数组的个数是2,且[nib objectAtIndex:0]即是图2中第一个Load View。
此时写loadView = [[nib objectAtIndex:0]; 把xib中Objects中的第一个对象赋给loadView。
既然,是要说明这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对象中的各个元素都已经存在。
(认真理解这句帮规:when using loadNibNamed:owner:options:, the File's Owner should be NSObject, the main view should be your class type, and all outlets should be hooked up to the view, not the File's Owner.)
3.再来详细讲解一下loadNibNamed
1、loadNibNamed方法:
-(NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options
参数:
name:nib文件的名称
owner:指定name参数所指代的nib文件的File's Owner
options:当nib文件开始时,需要的数据
返回值:返回符合对象的数组。
例子:初始化一个View
CustomCell *cell=(CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellTableIdentifier]; if (cell==nil) { NSArray *nib=[[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil]; cell=[nib objectAtIndex:0];// 因为返回的是数组 }
在这个时候生成后会让引用计数器变为1,但是需要注意得,owner:self ,在owner自己dealloc得时候,系统会自动帮你将你自定义view引用计数器-1得。
特别注意:
loadNibNamed:owner:options: 这个函数会返回一个nib的数组。不过,在iPhone2.1包括以后的版本,这个数组的第一个元素,即nib[0]表示的就是除了File‘s Owner 和 File Responder后的第一个东西。在iPhon2.1之前的版本,nib[0]是File's Owner,nib[1]才是除了File‘s Owner 和 File Responder后的第一个东西。
例子:
一个继承UIView的类
图1
图2
在objects一栏中设置LoadView.xib的class为要创建的类型( 这里是LoadView.h)
然后调用[[NSBundle mainBundle]loadNibNamed:@"LoadView" owner:self options:nil],这里的owner参数无所谓,随便设置,(猜测)因为我的xib文件中没有对File‘s Owner的Outlets进行关联。
使用数组对象接收:NSArray *nib=[[NSBundle mainBundle] loadNibNamed:@"LoadView" owner:self options:nil];
数组中的元素是图2中Objects一栏中的元素,注意,这里并没有包含LoadView中的节点元素,所以Objects个数是2,即nib数组的个数是2,且[nib objectAtIndex:0]即是图2中第一个Load View。
此时写loadView = [[nib objectAtIndex:0]; 把xib中Objects中的第一个对象赋给loadView。
相关文章推荐
- ListView的优化问题
- 内存泄漏以及常见的解决方法
- Cookie/Session机制详解
- Foundations of Qt Development 学习笔记 Part1 Tips1-50
- OpenStack简易安装教程--Havana版本
- activity异常被系统杀死处理方法
- C#实现实体类与字符串互相转换的方法
- JS学习之预解释
- TCPL学习毕节:第六章hash表
- [LeetCode 253] Meeting Rooms II
- [置顶] MongoVUE(1.6.9.0)登录提示:Connection was refused的解决办法
- WinForm实现仿视频播放器左下角滚动新闻效果的方法
- 宽客的人&&事件映射
- 关于JAVA继承、多态、抽象类、接口等性质的学习(1)
- TCPL学习笔记:4-12以及4-13。关于使用递归的问题。
- 每天一个linux命令(47):iostat命令
- Linux中的free命令
- ListView中getView()多次调用原因
- iOS:Xcode 6以后如何创建预编译文件(pch)
- NYOJ——12 喷水装置(二)(区间覆盖)