调用cellForRowAtIndexPath后,多个单元格会受到影响

时间:2015-04-13 02:33:17

标签: ios

我有一个UITableView,我想更改所选行的文本颜色。但是我看到其他15行受到了影响以及我点击的那一行。这是在master-detail示例项目下测试的。

if let indexPath = self.tableView.indexPathForSelectedRow(){ 
    self.tableView.cellForRowAtIndexPath(indexPath)?.textLabel?.textColor = UIColor.redColor()
}

我在调试会话中检查了cellForRowAtIndexPath值,它似乎只返回一个对象,其他单元格也受到了怎样的影响?

1 个答案:

答案 0 :(得分:1)

重复使用单元格 - 几乎可以肯定,您并未将单元格重置为prepareForReuse中的基本状态,并且在每次调用cellForRowAtIndexPath时都正确配置它们。

当您查看可以同时显示一定数量单元格的表格视图时,通常只会存在比可以显示的单元格多一个单元格。当一个单元从屏幕上移开时,它被放置在一个单元池中以便重复使用。在单元格移动到屏幕上之前,您在cellForRowAtIndexPath中进行配置。如果您已在单元中配置了某些内容,并且每次从cellForRowAtIndexPath返回单元格时都未明确配置该内容,则该配置将保留在重用池中的单元中。在重用每个单元格之前也会调用函数prepareForReuse - 如果您有子类UITableViewCell,那么您可以实现此函数以将单元格返回到基本配置,以便像文本颜色这样的设置不会意外地影响多个细胞。

这种方法可以在使用最少内存的情况下平滑地滚动整个表格视图。每次消失并且需要新的细胞时,创建和销毁细胞是一项昂贵的操作。

最简单的解决方法是始终将文本颜色设置为cellForRowAtIndexPath - 基本颜色或某些单元格中所需的特殊颜色。