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