参考文章
1、- awakeFromNib
awakeFromNib它是NSObject类目里提供的一个方法,根据类目名,我们也能见名思意的知道,它是用于Interface Builder的,也就是给xib文件和storyboard(storyboard在打包时会拆解成它包含的xib文件,接下来就不特意提及storyboard了)的。
它的原理是,当xib文件加载完的时候,会发送一个awakeFromNib的消息到xib文件中的每个对象,每个对象都可以重写自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。比如storyboard上的一个scene,也就是一个xib,它加载完成时,会给它上面的每个对象发一条消息。
它是基类的扩展方法,这就为我们用代码更细腻的操作xib创造了可能。在xib文件的Indentity inspector中,将xib文件上的对象与类绑定。然后在.m文件中重写- awakeFromNib即可。
以下是我把storyboard中的navigation item 与我自己定制的继承于UINavigationItem的类绑定后的代码片段
-(void)awakeFromNib
{
//说明文档里说必须调用父类的awakeFromNib,以防出现意外,详细说明见文档
[super awakeFromNib];
self.searchItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"m_search23"] style: UIBarButtonItemStylePlain target:self action:@selector(searchAction)];
self.leftBarButtonItem =_searchItem;
}
此方法的调用时机在-initWithCoder:之后(根据它的实现机制,这并不意外)。
2、-(id)initWithCoder:(NSCoder *)aDecoder
只要遵从了NSCoding协议的类都有-initWithCoder:这个方法。xib文件的类常常会用到这个方法,我猜是因为xib文件编码解码用了-initWithCoder:和-encodeWithCoder:,所以如果我们重写-initWithCoder:,就可以对xib文件的初始化作代码上的调整。
它的机制是用从unarchiver得到的数据初始化一个对象。
上面的功能也可以这样实现:
-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
self.searchItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"m_search23"] style: UIBarButtonItemStylePlain target:self action:@selector(searchAction)];
self.leftBarButtonItem =_searchItem;
return self;
}
此方法的调用时机在- awakeFromNib之前(这也是当然的)。
3、- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options
我们加载xib文件要用到的一个方法。
目前没遇到什么特别的疑惑,举个我用过的例子吧:
-(id)initWithBridge:(HeaderAndTableBridge*)bridge
{
//这里不再是 self = [super init]...
self = [[[NSBundle mainBundle]loadNibNamed:@"HeaderViewForTable" owner:self options:nil]objectAtIndex:0];
self.shareBtn.layer.cornerRadius = CGRectGetHeight(self.shareBtn.frame)/15.0;
self.hl_bridge = [[HeaderAndListBridge alloc]init];
NetworkService* service = [[NetworkService alloc]init];
[service getDataWithType:NetworkCategory token:[NSString getToken] timeStamp:[NSString getTimeStamp] data:nil success:^(RetData *retData) {
self.hl_bridge.listArray = [retData.ret_msg objectForKey:@"data"];
} failure:^(NSError *error) {
NSLog(@"分类 error =%@",error);
}];
self.ht_bridge = bridge;
return self;
}
4、-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
这个是视图控制器加载并初始化bundle里的xib文件的方法。这个方法应该不常用,原因很简单,你一般不会把一个视图控制器做成xib的。如图,苹果也没有直接提供视图控制器的xib:
网友评论