我正在开发一个应用程序,其中大部分UI是通过Xcode中的Storyboard设置的。我想要做的一件事是在TabBar上为UITabBarItem指定“完成”图像,而不是可以通过Interface Builder访问的默认“Stencilled”图像。
我的问题是最好的地方在哪里,我目前在awakeFromNib中这样做,因为当事情从故事板中取消归档时需要完成它,但我不确定我是否应该使用initWithCoder:相反,最重要的是什么?
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if(self) {
UIImage *tabIn = [UIImage imageNamed:@"TAB_IN"];
UIImage *tabOut = [UIImage imageNamed:@"TAB_OUT"];
UITabBarItem *tabBarItem = [self tabBarItem];
[tabBarItem setFinishedSelectedImage:tabOut withFinishedUnselectedImage:tabIn];
[tabBarItem setTitle:@"TWO"];
}
return self;
}
OR
- (void)awakeFromNib {
[super awakeFromNib];
UIImage *tabIn = [UIImage imageNamed:@"TAB_IN"];
UIImage *tabOut = [UIImage imageNamed:@"TAB_OUT"];
UITabBarItem *tabBarItem = [self tabBarItem];
[tabBarItem setFinishedSelectedImage:tabOut withFinishedUnselectedImage:tabIn];
[tabBarItem setTitle:@"TWO"];
}
我知道当出口和操作尚未连接时,在从nib(包含在故事板中)取消归档对象的开始时调用initWithCoder:
。我也理解在unarchiving过程结束时调用awakeFromNib
并发出viewController现在可以使用的信号。我的感觉是,它实际上只取决于你想做什么,虽然使用awakeFromNib
可能证明问题较小,因为你不会遇到插座和行动尚未连接的问题。
让我重新说一下,你会使用initWithCoder:
与awakeFromNib
相关的情况,反之亦然?
答案 0 :(得分:2)
在编辑之前,您似乎已在段落中回答了自己的问题。
当一个对象收到一个awakeFromNib消息时,它保证设置所有的插座实例变量。
因此,如果您必须在初始化代码中访问IBOutlet
ivars,则必须使用awakeFromNib
方法执行此操作。
虽然在我不需要访问出口的情况下我更喜欢initWithCoder:
,因为根据NSCoding
documentation使用NSCoding
协议解码对象是正确的初始化方法:
initWithCoder:指示对象从提供的编码器中的数据初始化自身;因此,替换任何其他初始化方法,每个对象只发送一次
作为旁注,但它并没有太大的区别,如果我必须在初始化代码中访问插座,我不会同时实现awakeFromNib
和initWithCoder:
简单。因此,如果涉及出口,我通常会实施awakeFromNib
并在那里进行所有初始化。