UITableViewCell与UILabel子视图缓存问题

时间:2012-07-19 20:58:40

标签: objective-c ios uitableview uilabel

首先,请不要告诉我这是重复的。我知道这个问题已被多次询问和回答,但即使在阅读了其他人的解决方案后,我仍然无法使我的代码工作。

我的UITableViewCell存在问题,其中包含UILabel子视图。 UILabel有时不会出现在某些细胞中,直到我从那些细胞滚动并返回它们。这是我用来自定义单元格的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

UILabel *label;

if (cell == nil) {

    // cell is nil, create it

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:CellIdentifier];


    label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 33)];
    label.tag = 888;

} else {

    label = (UILabel*)[cell.contentView viewWithTag:888];
    [label removeFromSuperview];

}

label.text = @"Label Text";
label.backgroundColor = [UIColor clearColor];
[label sizeToFit];
label.center = CGPointMake(cell.contentView.frame.size.width-label.frame.size.width/2-20, cell.contentView.frame.size.height/2);
[cell.contentView addSubview:label];

// customize cell text label
cell.textLabel.text = @"Cell Text";
cell.textLabel.textColor = [UIColor darkGrayColor];

return cell;
}

当dequeueReusableCellWithIdentifier:CellIdentifier返回非零值但是如果返回值为nil并且必须实例化新单元格时,看起来好像标签显示正确。

如果有人知道为什么会发生这种情况,那么非常感谢帮助。

4 个答案:

答案 0 :(得分:1)

我看到了你想要做的几件事。

1)阅读“sizeToFit” - 描述说如果视图没有超级视图,你可能会得到奇怪的结果。

2)创建视图时,立即将其添加到单元格中。

3)在调整单元格大小后,获取其大小,然后计算正确的框架 - 我建议不使用“中心”,但我不知道您的代码不适用于事实。

4)在更改中心以更改框架之前,硬编码如下:

CGRect r = label.frame;
r.origin = (CGPoint){ 20, 20 };
label.frame = r;

这至少会说服你新细胞和旧细胞正常工作。然后你可以计算你真正想要的帧,或者进一步使用中心。

答案 1 :(得分:0)

不确定问题的原因,但您可以进行一些改进。也许其中一个解决了这个问题:

  1. 在dequeu方案中,您从视图中删除标签,仅将其添加回来。相反,您应该将其保留在视图层次结构中。

  2. 为避免必须一直调整大小并移动标签。为什么不使它足够宽,将文本右对齐。这样,您就不必调整在出列场景中移动标签的大小。

答案 2 :(得分:0)

似乎问题可能在于修改cell.textLabel。本网站上的其他帖子建议,每次修改此标签时,实际上都会创建一个新标签并将其添加到单元格的内容视图中(而不是仅修改现有标签)。设置cell.textLabel.backgroundColor = [UIColor clearColor];似乎解决了问题

我仍然对此感到困惑,因为即使最后添加我的自定义标签子视图(在设置cell.textLabel的属性之后)也无法解决问题 - 必须将cell.textLabel的背景颜色设置为透明/清除。

答案 3 :(得分:0)

有三件事情不合适:

if (cell == nil) { // cell is nil, create it

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:CellIdentifier];

    label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 33)];
    label.tag = 888;
    [cell.contentView addSubview:label]; // (1) DO THIS HERE

} else {

    label = (UILabel*)[cell.contentView viewWithTag:888];
    // (2) DON'T DO THIS:  [label removeFromSuperview];

}

label.text = @"Label Text";
label.backgroundColor = [UIColor clearColor];
[label sizeToFit];
label.center = CGPointMake(cell.contentView.frame.size.width-label.frame.size.width/2-20, cell.contentView.frame.size.height/2);
// (3) DON'T DO THIS HERE: [cell.contentView addSubview:label];
....

我认为ARC已启用,否则在将其添加到contentView后需要[标签发布]。