我目前正在为我的应用程序进行更新。我打算添加的新功能之一需要我替换 aUILabel
中的 a类UITableViewCell
。但是,我以前使用 Xcode 中为单元格提供的默认样式之一,并且禁用了替换类的选项。
是否有任何解决方法而无需重写我的大部分代码?
我目前正在为我的应用程序进行更新。我打算添加的新功能之一需要我替换 aUILabel
中的 a类UITableViewCell
。但是,我以前使用 Xcode 中为单元格提供的默认样式之一,并且禁用了替换类的选项。
是否有任何解决方法而无需重写我的大部分代码?
为了具体做你所要求的,我会使用一些漂亮的Objective-C hacks来改变一些类。就是这样:
1) 创建一个新的 UILabel 子类。对于此示例,我将使用名为SwizzleLabel
.
2)在这个新标签类中,添加一个方法来应用一些样式(比如将文本颜色更改为您想要的颜色等)。这基本上是 init 方法的替代品。
-(void)applyStyles {
[self setBackgroundColor:[UIColor blueColor]];
[self setTextColor:[UIColor redColor]];
[self setHighlightedTextColor:[UIColor orangeColor]];
}
<objc/runtime.h>
3)在您将要更改此类的任何地方导入(例如,在您的视图控制器中等)。
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;
}