現在、アプリのアップデートに取り組んでいます。追加しようとしている新機能の1つでは、のクラスを置き換える必要がありUILabel
ますUITableViewCell
。ただし、以前はセルにXcodeで提供されているデフォルトのスタイルの1つを使用していたため、クラスを置き換えるオプションは無効になっています。
ほとんどのコードを書き直さなくても、これを回避する方法はありますか?
現在、アプリのアップデートに取り組んでいます。追加しようとしている新機能の1つでは、のクラスを置き換える必要がありUILabel
ますUITableViewCell
。ただし、以前はセルにXcodeで提供されているデフォルトのスタイルの1つを使用していたため、クラスを置き換えるオプションは無効になっています。
ほとんどのコードを書き直さなくても、これを回避する方法はありますか?
あなたが求めていることを具体的に行うには、いくつかの気の利いた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;
}