UITableView 索引路径行为表现奇怪

Posted

技术标签:

【中文标题】UITableView 索引路径行为表现奇怪【英文标题】:UITableView Index Path Behavior Acting Strange 【发布时间】:2017-05-26 20:38:43 【问题描述】:

所以我有一个表格视图,在 cellForRowAt 方法中有大约 150 行我有以下代码

cell.monthLabel.text = String(indexPath.row)
    
if indexPath.row == 0
    cell.backgroundColor = .blue

问题是为什么索引路径 9、18、27 等处的背景颜色为蓝色。

【问题讨论】:

【参考方案1】:

单元格被重复使用,您必须将所有 UI 元素设置为已定义的状态。

因此,如果您在第 0 行将 backgroundColor 设置为蓝色

if indexPath.row == 0 
    cell.backgroundColor = .blue

在所有其他情况下,您必须(重新)将其设置为默认颜色

else 
    cell.backgroundColor = .white

【讨论】:

感谢您解决了我的问题,但出于好奇,您是否会碰巧知道为什么它是每 9 个单元格而不是每个单元格都是蓝色的? 屏幕上有 7 个单元格,外加 2 个准备好的单元格——一个在顶部,一个在底部——当用户滚动时。【参考方案2】:

由于您没有显示 tableView(_:cellForRowAt:) 方法的所有代码,因此假设您正在使单元格出列(使用方法 dequeueReusableCell(withIdentifier:) 并已注册您的类以供重用(如果您使用自定义类)。

通过这种方法,单元格的视图可以重复使用。这意味着如果您不重新设置属性(例如背景颜色),它将只使用旧单元格的一种形式。

要解决此问题,您可以轻松地在代码中包含 else 并将背景颜色设置为白色。

如果您继承 UITableViewCell 类,您可以使用 prepareForReuse() 函数进行清理,例如重置背景颜色。

【讨论】:

很好的解释【参考方案3】:

UITableView 不会在每个项目上设置一次数据,它会根据正在进行的活动一次又一次地在所有可见项目上设置数据。我不能给你这种行为的明确原因,但我可以给你解决方案。每当您在具有某些条件的项目上设置一些数据时,也请始终使用“Else”语句。因此,对于这个特定问题,您只需在“If”条件下添加“Else”块,并在“Else”块中设置项目的白色背景。

【讨论】:

以上是关于UITableView 索引路径行为表现奇怪的主要内容,如果未能解决你的问题,请参考以下文章

UITableView + NSMutableArray 奇怪的行为

奇怪的行为 UIActionSheet + UITableView:行消失

UITableView 滚动时奇怪的布局行为变化

UITableView 方法“indexPathForRowAtPoint:”的奇怪行为

滚动 UITableView 的奇怪行为

在后台删除的数据导致 UITableView 中的索引超出范围崩溃