我有一个UITableView,我想更改所选行的文本颜色。但是我看到其他15行受到了影响以及我点击的那一行。这是在master-detail示例项目下测试的。
if let indexPath = self.tableView.indexPathForSelectedRow(){
self.tableView.cellForRowAtIndexPath(indexPath)?.textLabel?.textColor = UIColor.redColor()
}
我在调试会话中检查了cellForRowAtIndexPath值,它似乎只返回一个对象,其他单元格也受到了怎样的影响?
答案 0 :(得分:1)
重复使用单元格 - 几乎可以肯定,您并未将单元格重置为prepareForReuse
中的基本状态,并且在每次调用cellForRowAtIndexPath
时都正确配置它们。
当您查看可以同时显示一定数量单元格的表格视图时,通常只会存在比可以显示的单元格多一个单元格。当一个单元从屏幕上移开时,它被放置在一个单元池中以便重复使用。在单元格移动到屏幕上之前,您在cellForRowAtIndexPath
中进行配置。如果您已在单元中配置了某些内容,并且每次从cellForRowAtIndexPath
返回单元格时都未明确配置该内容,则该配置将保留在重用池中的单元中。在重用每个单元格之前也会调用函数prepareForReuse
- 如果您有子类UITableViewCell
,那么您可以实现此函数以将单元格返回到基本配置,以便像文本颜色这样的设置不会意外地影响多个细胞。
这种方法可以在使用最少内存的情况下平滑地滚动整个表格视图。每次消失并且需要新的细胞时,创建和销毁细胞是一项昂贵的操作。
最简单的解决方法是始终将文本颜色设置为cellForRowAtIndexPath
- 基本颜色或某些单元格中所需的特殊颜色。