1

現在、アプリのアップデートに取り組んでいます。追加しようとしている新機能の1つでは、のクラスを置き換える必要がありUILabelますUITableViewCell。ただし、以前はセルにXcodeで提供されているデフォルトのスタイルの1つを使用していたため、クラスを置き換えるオプションは無効になっています。

ほとんどのコードを書き直さなくても、これを回避する方法はありますか?

4

1 に答える 1

2

あなたが求めていることを具体的に行うには、いくつかの気の利いたObjective-Cハックを使用していくつかのクラスを変更します。方法は次のとおりです。

1) 新しい UILabel サブクラスを作成します。この例では、という名前のクラスを使用しますSwizzleLabel

2) この新しいラベル クラス内に、いくつかのスタイルを適用するメソッドを追加します (テキストの色を好きな色に変更するなど)。これは基本的に init メソッドの代わりです。

-(void)applyStyles {

    [self setBackgroundColor:[UIColor blueColor]];
    [self setTextColor:[UIColor redColor]];
    [self setHighlightedTextColor:[UIColor orangeColor]];

}

3) このクラスを変更する場所 (たとえば、View Controller など) にインポート<objc/runtime.h>します。

4)cellForRowAtIndexPath:メソッドで、Class.

Class newLabelClass = objc_getClass("SwizzleLabel");

5) クラスを交換します。

object_setClass([cell textLabel], newLabelClass);

6) 最後に、いくつかのカスタム スタイルを適用します (基本的には init メソッドの代わりになります)。

[[cell textLabel] performSelector:@selector(applyStyles)];

これで、ラベル クラスがサブクラスに完全に交換されたことがわかります。私の最終的なcellForRowAtIndexPath:方法は次のようになりました:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath   *)indexPath {

    UITableViewCell *cell = [[UITableViewCell alloc] init];

    Class newLabelClass = objc_getClass("SwizzleLabel");
    object_setClass([cell textLabel], newLabelClass);
    [[cell textLabel] performSelector:@selector(applyStyles)];

    [[cell textLabel] setText:@"Testing"];

    return cell;

}
于 2013-02-25T18:48:17.187 に答える