接着 iOS 使用nib文件(一)来。
在TestNibView.m中有个方法
-(id)initWithCoder:(NSCoder *)aDecoder;
这个方法来自NSCoding协议。NSCoding协议如下,就两个方法。
@protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; - (id)initWithCoder:(NSCoder *)aDecoder; // NS_DESIGNATED_INITIALIZER @end
- (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]。
版权声明:欢迎评论和转载,但请保留出处!
原文:http://blog.csdn.net/u011367651/article/details/47302113