滚动时 UITableViewCell 内容会发生变化,因为在其中一个单元格中运行计时器

Posted

技术标签:

【中文标题】滚动时 UITableViewCell 内容会发生变化,因为在其中一个单元格中运行计时器【英文标题】:UITableViewCell contents change when scrolling because running a timer in one of the cell 【发布时间】:2018-04-08 08:01:44 【问题描述】:

我有一个包含 3 个单元格的表格视图。在其中一个单元格中,我试图显示一个计时器,该计时器在滚动时显然会弄乱我的单元格内容。

这是我的代码:

   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! StatsuSessionTableViewCell

        if indexPath.row == 0 
            // do something
            return cell
         else if indexPath.row == 1 
            // do something
            return cell
         else if indexPath.row == 2 
            _ = Timer.every(1.second)  (timer: Timer) in
                let time = self.date.timeIntervalSince(Date())
                cell.statusTitle.text = "TIME"
                cell.statusDescription.text = time.timerFormat

                if time < 0 
                    timer.invalidate()
                
            
            return cell
        

        return cell
    

如果我删除计时器并只显示一些文本,我没有任何问题。但显然因为单元格被破坏并重新创建,这弄乱了我的内容,计时器也会出现在 indexpath.row 0 而不仅仅是 indepxath.row 2。

有什么解决方法吗?

【问题讨论】:

这是一个猜测,所以我不会把它写成答案(还没有!),但我认为这是因为单元格重用 - 第一次,单元格在第 2 行,另一次不是,但计时器从第一次开始就在那里。一个快速测试看看是否是这种情况是每次都创建一个新单元格(在第 2 行),看看问题是否消失。如果是这样,我会查看设置标签或其他内容,如果设置了标签并且它不在正确的行中,则使计时器无效。 您的意思是在第 2 行的 if 语句中创建单元格?因为我试过了,它做同样的事情...... 不,我的意思是代码面板的第 2 行。以let cell = tableView.dequeueReusableCell... 开头的那个 不要在单元格中运行计时器。单元格应该是模型中数据的轻量级显示。如果你的模型应该根据时间更新,那么在模型或视图控制器中进行。例如。 ***.com/questions/49246036/… @Paulw11:是的,这更有意义。感谢您的链接。 【参考方案1】:

所以您的问题是您正在cellForRowAt: 中创建计时器。计时器也适用于通过重用此单元创建的单元。所以你必须在StatsuSessionTableViewCell 中实现这个定时器逻辑。还要在单元格中实现prepareForReuse 方法并使那里的计时器无效。这是我能建议的最安全的方法。

【讨论】:

以上是关于滚动时 UITableViewCell 内容会发生变化,因为在其中一个单元格中运行计时器的主要内容,如果未能解决你的问题,请参考以下文章

滚动后 UITableViewCell 内的 UIView 中的渐变发生了变化

UITableViewCell 图像在滚动时消失

滚动时 UITableViewCell 的选定按钮消失

滚动时 UITableViewCell 图像发生变化

TableView 滚动时自定义 UITableViewCell 发生变化

滚动 UITableViewCell 时自动布局中断,尤其是对于 UIImageView