使用故事板时设置完成的TabBar图像?

时间:2013-02-07 17:25:30

标签: iphone objective-c cocoa-touch awakefromnib initwithcoder

我正在开发一个应用程序,其中大部分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相关的情况,反之亦然?

1 个答案:

答案 0 :(得分:2)

在编辑之前,您似乎已在段落中回答了自己的问题。

documentation表示

  

当一个对象收到一个awakeFromNib消息时,它保证设置所有的插座实例变量。

因此,如果您必须在初始化代码中访问IBOutlet ivars,则必须使用awakeFromNib方法执行此操作。

虽然在我不需要访问出口的情况下我更喜欢initWithCoder:,因为根据NSCoding documentation使用NSCoding协议解码对象是正确的初始化方法:

  

initWithCoder:指示对象从提供的编码器中的数据初始化自身;因此,替换任何其他初始化方法,每个对象只发送一次

作为旁注,但它并没有太大的区别,如果我必须在初始化代码中访问插座,我不会同时实现awakeFromNibinitWithCoder:简单。因此,如果涉及出口,我通常会实施awakeFromNib并在那里进行所有初始化。