我在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的值不会重新绘制,即旧值保留,新值与旧值重叠。 为什么会发生这种情况以及如何解决?
答案 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。代码原本不是我写的,我只是修理它:)