initWithNibName与一般init的区别

本文详细阐述了Swift中initWithNibName和loadNibNamed方法的区别,包括它们如何加载UI界面、集成类的不同、加载方式的区别以及实例应用。通过对比,帮助开发者理解在不同场景下选择合适的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/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. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值