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

标签 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 时,单元格无法正确回收。例如,如果我单击顶部单元格上的开始按钮,计时器开始运行并且其标签将开始更改,然后如果我向下滚动另一个单元格的标签也将更改为与顶部单元格相同,没有它的计时器正在启动。

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

最佳答案

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

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

关于ios - 当 Timer 为每个 UITableViewCell 运行时,它们没有被正确回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41292402/

相关文章:

ios - 服务器请求因 JSON 中的 “%0A” URL 编码而失败

iOS慢速图像像素迭代

ios - 如何更改 searchcontroller 中的 uitextfield 颜色?

ios - for 循环错误

ios - 在 UITableViewCell 中模糊图像时出现性能问题

iphone - uitableview 不显示数据

ios - 如何更改 NavigationBar 上 BarButtonItem 的文本?

ios - 如何在不使用 timer.invalidate() 的情况下重置和暂停计时器

objective-c - NSSortComparator 对 NSMutableArray 没有影响

android - 如何从 appcenter 命令行和 Jenkins 将 IPA 和 APK 文件推送到 App Center Distribute