码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 使用nib文件(二)

时间:2015-08-05 22:29:36      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:ios   nib   xib   initwithcoder   awakefromnib   

接着 iOS 使用nib文件(一)来。

在TestNibView.m中有个方法

-(id)initWithCoder:(NSCoder *)aDecoder;

这个方法来自NSCoding协议。NSCoding协议如下,就两个方法。

@protocol NSCoding

- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder; // NS_DESIGNATED_INITIALIZER

@end

nib文件能够保存和恢复对象就需要用到这两个方法。我们在需要归档自己自定义的对象时,也会实现这两个方法。 对于UIView(包括子类)和UIViewController(包括子类)系统都已经实现了这两个方法。使用xib文件实例化对象时,首先

- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options;

会被调用,接着,系统就会调用initWithCoder来实例化实现了NSCoding协议的对象,而没有实现NSCoding协议的对象,会调用其init方法。按照文档描述,initWithCoder只是loadNibNamed方法中的一部分。

iOS 使用nib文件(一)中说道TestNibView中的一个方法

+(instancetype)testNibView  
{  
    return [[[NSBundle mainBundle]loadNibNamed:@"TestNibView" owner:self options:nil] firstObject];  
}  
这种使用了单独的xib文件的view只能通过代码去使用,而没有办法在其他的xib中使用。假设在A.xib中,我们拖拽了一个UIView叫做View,将其class设置为TestNibView,这个时候,和TestNibView类关联的xib就不是TestNibView.xib,而是View,我们可以在View上加一个按钮,这个按钮可以作为outlet和TestNibView的button关联起来。

需要注意的是initWithCoder方法只是一个init方法,它只是确保init,至于outlet这些关联在这个方法并没有完成关系,这一步,打印self.button是nil。loadNibNamed还会在initWithCoder之后调用awakeFromNib。而到了awakeFromNib方法中,这些outlets、delegate才确保已全部关联,这个方法中[super awakeFromNib]后打印self.button不为空。一般来说,我们并不需要在awakeFromNib中做些什么,除了那些没有办法在xib中设置的东西,重载记得调用[super awakeFromNib]。




版权声明:欢迎评论和转载,但请保留出处!

iOS 使用nib文件(二)

标签:ios   nib   xib   initwithcoder   awakefromnib   

原文地址:http://blog.csdn.net/u011367651/article/details/47302113

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!