我有一个 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/