在 UITableView 中滚动时第一个和最后一个单元格更改颜色

First and Last Cell Change Color When Scrolling in UITableView

我有一个具有特定颜色的自定义单元格列表,具体颜色取决于时间。计时器运行以保持每个单元格的颜色是最新的。每次我一直滚动到 tableView 的顶部或底部时,tableView 中的第一个和最后一个单元格都有彼此的颜色。例如,如果第一个单元格是绿色而最后一个单元格是红色,那么当我向上滚动时第一个单元格变为红色,一秒钟后变为绿色。这是我的计时器:

// Refreshes the labels every second to update the time
    timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { [weak self] _ in
        if let s = self, let tableView = s.tableView, let indexPaths = tableView.indexPathsForVisibleRows {
            for indexPath in indexPaths {
                guard let cell = tableView.cellForRow(at: indexPath) as? PersonCell else { return }
                let person = s.people[indexPath.section]
                let day = dayOfWeekIn(timeZone: person.timeZone)

                // update text of cell and check some conditions to set the gradient of the cell accordingly
        }
    })

我也在cellForRowAt中配置了我的单元格,但是这些配置与单元格的背景无关,所以我认为这不是问题的原因。如果有人能帮我解决这个问题,我将不胜感激。

细胞被重复使用...

这意味着,当您向下滚动然后向上滚动时,您可以看到一个单元格的背景颜色更改为红色,而它位于第 20 行,但现在用于第 0 行。

您需要在 cellForRowAt 每次 中明确设置所需的背景颜色。

编辑

您可以使用当前的方法更改背景颜色,但您必须将当前背景颜色作为数据源的一部分进行跟踪。

例如,将 currentBackgroundColor 属性 添加到您的 Person class。当您这样做时:

// update text of cell and check some conditions to set the gradient of the cell accordingly

你也会做(类似的事情):

data[indexPath.section].currentBackgroundColor = UIColor.green

当你接到 cellForRowAt 的电话时,你会 做:

cell.backgroundColor = data[indexPath.section].currentBackgroundColor

在没有看到您的实际数据源/结构的情况下,很难给您一个明确的示例,但就是这样。