6

UI の大部分が Xcode のストーリーボードを介してセットアップされるアプリケーションに取り組んでいます。私がやりたいことの 1 つは、Interface Builder を介してアクセスできるデフォルトの「Stencilled」画像ではなく、TabBar の UITabBarItems に「Finished」画像を指定することです。

私の質問は、これを行うのに最適な場所はどこかということです。現在、ストーリーボードからアーカイブを解除する必要があるため、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 メッセージを受信すると、すべてのアウトレット インスタンス変数が設定されていることが保証されます。

したがってIBOutlet、初期化コードで ivar にアクセスする必要がある場合は、awakeFromNibメソッドでアクセスする必要があります。

ドキュメントに従ってプロトコルinitWithCoder:でデコードされるオブジェクトの適切な初期化メソッドであるため、アウトレットにアクセスする必要がない場合は好みますが:NSCodingNSCoding

initWithCoder: 提供されたコーダーのデータから自身を初期化するようにオブジェクトに指示します。そのため、他の初期化メソッドを置き換え、オブジェクトごとに 1 回だけ送信されます。

余談ですが、大した違いはありません。初期化コードでアウトレットにアクセスする必要がある場合は、簡単にするために両方awakeFromNibを実装しません。initWithCoder:したがって、アウトレットが関係している場合は、通常、そこでawakeFromNibすべての初期化を実装して実行します。

于 2013-02-11T12:41:45.473 に答える