Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当计时器为每个UITableViewCell运行时,它们没有被正确回收_Ios_Swift_Uitableview_Swift3_Uikit - Fatal编程技术网

Ios 当计时器为每个UITableViewCell运行时,它们没有被正确回收

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

我有一个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
的一个实例从屏幕上滚下时,当另一端需要一个新单元时,将再次使用该实例。当你在一个单元格中启动一个计时器时,这个单元格会被重用,因为它是同一个对象,所以它有一个已经在运行的计时器。如果设计具有某种状态(例如,运行计时器)的单元格,则需要在重新使用该单元格时重置该状态,否则将保持不变


如果要在单元中保留计时器,则需要安排在重复使用单元时停止并重新启动计时器。您可以通过在表单元格类中重写
prepareforeuse
来停止计时器,这样在重用单元格时就不会有正在运行的计时器。要重新启动它们,您必须让表视图数据源跟踪哪些单元格有正在运行的计时器,这样您就可以在对单元格进行排队时启动计时器。

作为@Tom Harrington回答的替代方法,我建议将计时器与数据源耦合。