initWithNibName与一般init的区别

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.VideoCellControllerloadNibNamed方法

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得执行顺序是这样子的


supper :
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
set   param=@“supper-A”
NSLog(@“A-initNIb”);
}
viewDIdLoad
{
[super viewDidiLoad];
NSLog(@“A-view”);
NSLog(param);
}

sub:
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
set   param=@“sub-B”
NSLog(@“B-initNIb”);
}
viewDIdLoad
{
[super viewDidiLoad];
NSLog(@“B-View”);
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已经执行过了,为了避免这样可以改成

sub
viewDIdLoad
{
NSLog(@“B-View”);
NSLog(param);
[super viewDidiLoad];
}

- (void)viewDidLoad{
[selfsetWords:@” pleaseanswer the door”];
[super viewDidLoad];
}

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值