关于 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对象中的各个元素都已经存在。
(认真理解这句帮规: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。