UITableView单元格重绘会导致文本重叠

时间:2011-11-25 14:24:12

标签: iphone ios uitableview

我在cellForRowAtIndexPath

中关注
NSString *cellIdentifier = @"Cell";
LibraryCell *cell = (LibraryCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell != nil) {
    [cellIdentifier release];
    [self setItems:cell forRowAtIndexPath:indexPath];
    return cell;
}
cell = [[[LibraryCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier] autorelease];
[self setItems:cell forRowAtIndexPath:indexPath];
return cell;

[self setItems:cell forRowAtIndexPath:indexPath];仅更改相应单元格内的一些UILabel值。

所以现在当我编辑UITableView并删除时,让我们说第一行,UILabel的值不会重新绘制,即旧值保留,新值与旧值重叠。 为什么会发生这种情况以及如何解决?

3 个答案:

答案 0 :(得分:3)

我猜你误解了细胞标识符的概念。 它仅用于区分您可能称之为“标记”的内容,用于在屏幕上打印单元格的外观。所以你很可能只需要一个单元格标识符。

它有助于系统缓存“邮票”的实例。调用cellForRowAtIndexPath时,您只需选择要使用的邮票类型。如果您之前创建了正确的实例(即,在使用单元格标识符字符串请求时返回一个实例),则只需更改标签文本等,然后将其返回。在现实生活中,这可能比作其中一个日期戳,您可以通过转动印章上的小旋钮来更改日期。这是通过为单元格中包含的标签指定新文本来执行的操作。

您似乎通过连接字符串值为模型中的每个索引创建戳记,有效地创建与模型中的行一样多的实例。除了不必要之外,它还可能导致内存压力和口吃,因为它抵消了UITableView的各种优化。

我建议您阅读Apple的文档或查看iTunes U(here)  关于iOS开发的斯坦福课程。它在那里得到了很清楚的解释。

答案 1 :(得分:2)

首先,您应该为您的cellIdentifier使用相同的名称

请参阅UITableView Class reference http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier

如果您无法获得可重复使用的单元格,请创建它。之后更新您的单元格。 代码应该是这样的

LibraryCell *cell = (LibraryCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)  {
    //  create a new cell
    ...
}

//  Update cell
...

return cell;

答案 2 :(得分:0)

其实我想通了!问题来自setItems:forIndextPath方法。 它在本地创建UILabel并释放它。所以每次都是在最后一个文本文本上绘制的。使UILable实例变量解决了这个问题。

PS。代码原本不是我写的,我只是修理它:)