更改UITableViewCell的默认样式子视图'类

时间:2013-02-25 18:02:18

标签: iphone xcode cocoa-touch uitableview ios6

我正在为我的应用程序进行更新。我打算添加的新功能之一要求我替换UILabelUITableViewCell的类。但是,我之前使用Xcode中为单元格提供的默认样式之一,并且禁用了替换类的选项。

是否有任何解决方法,而无需重写我的大部分代码?

1 个答案:

答案 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;

}