当每个UITableViewCell运行一个Timer时,它们没有被正确回收

时间:2016-12-22 22:12:26

标签: ios swift uitableview swift3 uikit

我有一个UITableView,每个单元格都有一个标签。当在单元格上按下按钮时,我需要每0.01毫秒更新每个单元格的标签。

func tick(label: UILabel) {
    let timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { (timer) in
        // functionality to decide what to put in the label goes here
        label.text = "some string"
    }
}


// button action
@IBAction func startButtonPressed(_ sender: UIButton) {
    let buttonPostion = sender.convert(CGPoint.zero, to: tableView)

    if let indexPath = tableView.indexPathForRow(at: buttonPostion), let cell = tableView.cellForRow(at: indexPath) as? CustomCell {
        tick(label: cell.label)
    }
}

我遇到的问题是当我滚动UITableView时,细胞不能正常回收。例如,如果我单击顶部单元格上的开始按钮,计时器开始运行并且其标签将开始更改,然后如果我向下滚动另一个单元格的标签也将更改与顶部单元格相同,它的计时器正在启动。

解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

听起来好像正在重复使用细胞。细胞重用的想法是当UITableViewCell的实例滚出屏幕时,当另一端需要新的细胞时,再次使用该确切的实例。您在单元格中启动计时器,该单元格被重用,并且因为它是同一个对象,它具有已经运行的相同计时器。如果您设计具有某种状态的单元格(例如,正在运行的计时器),则需要在单元格重用时重置该状态,否则它将保持不变。

如果您要在单元格中保留计时器,则需要安排在重复使用单元格时停止并重新启动计时器。您可以通过覆盖表格单元格类中的prepareForReuse来停止计时器,以便在重复使用单元格时永远不会有正在运行的计时器。要重新启动它们,您必须让表视图数据源跟踪哪些单元格有运行计时器,以便在出列单元格时启动计时器。