6

我正在开发一个应用程序,其中大部分 UI 是通过 Xcode 中的 Storyboard 设置的。我想做的一件事是为 TabBar 上的 UITabBarItems 指定“完成”图像,而不是您可以通过 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;
}

或者

- (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"];
}

我知道initWithCoder:当出口和动作尚未连接时,在从笔尖(包含在故事板中)取消归档对象开始时调用。我也知道awakeFromNib在取消归档过程结束时会调用它,并表示 viewController 现在可以使用了。我的感觉是,这实际上取决于您想做什么,尽管使用awakeFromNib可能会证明问题较小,因为您不会遇到尚未连接出口和操作的问题。

编辑:

让我换个说法,你会在什么情况下使用initWithCoder:awakeFromNib反之亦然?

4

1 回答 1

2

看来您已经在编辑前的段落中回答了自己的问题。

文件指出

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

因此,如果您必须在初始化代码中访问IBOutletivars,则必须在awakeFromNib方法中进行。

虽然我更喜欢initWithCoder:不需要访问插座的情况,因为它是NSCoding根据NSCoding文档使用协议解码的对象的正确初始化方法:

initWithCoder:指示对象从提供的编码器中的数据初始化自己;因此,它取代了任何其他初始化方法,并且每个对象仅发送一次

awakeFromNib不过附带说明一下,它并没有太大的区别,并且在我必须在我的初始化代码中访问插座的情况下,initWithCoder:为了简单起见,我没有同时实现这两者。因此,如果涉及到网点,我通常会awakeFromNib在那里实施并进行所有初始化。

于 2013-02-11T12:41:45.473 回答