iOS 使用nib文件(二)

来源:互联网 发布:小蜜蜂订单系统源码 编辑:程序博客网 时间:2024/05/27 02:29

接着 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,而是A.xib中View,我们可以在View上加一个按钮,这个按钮可以作为outlet和TestNibView的button关联起来。这样就没有办法利用已经定义好的xib。

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


还要注意tableView的registerClass和registerNib的区别。前者调用initWithStyle...,不会调用awakeFromNib,后者不会调用initWithStyle...但是会调用awakeFromNib。一般前者用于代码创建的cell,而后者用于使用了xib创建的cell。在initWithStyle里面使用loadNibNamed:加载xib并没有什么意义,还不如直接registerNib。




0 0