1

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

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

4

1 回答 1

2

为了具体做你所要求的,我会使用一些漂亮的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;

}
于 2013-02-25T18:48:17.187 回答