Ios 当计时器为每个UITableViewCell运行时,它们没有被正确回收
我有一个UITableView,其中每个单元格都有一个标签。当按下单元格上的按钮时,我需要每0.01毫秒更新一次每个单元格的标签Ios 当计时器为每个UITableViewCell运行时,它们没有被正确回收,ios,swift,uitableview,swift3,uikit,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 her
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
的一个实例从屏幕上滚下时,当另一端需要一个新单元时,将再次使用该实例。当你在一个单元格中启动一个计时器时,这个单元格会被重用,因为它是同一个对象,所以它有一个已经在运行的计时器。如果设计具有某种状态(例如,运行计时器)的单元格,则需要在重新使用该单元格时重置该状态,否则将保持不变
如果要在单元中保留计时器,则需要安排在重复使用单元时停止并重新启动计时器。您可以通过在表单元格类中重写
prepareforeuse
来停止计时器,这样在重用单元格时就不会有正在运行的计时器。要重新启动它们,您必须让表视图数据源跟踪哪些单元格有正在运行的计时器,这样您就可以在对单元格进行排队时启动计时器。作为@Tom Harrington回答的替代方法,我建议将计时器与数据源耦合。