各セルにラベルが付いたUITableViewがあります。セル上のボタンを押すと、0.01ミリ秒ごとに各セルのラベルを更新する必要があります。それぞれのUITableViewCellでタイマーが実行されているとき、それらは正しくリサイクルされていません。
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をスクロールすると、セルが適切にリサイクルされないということです。たとえば、一番上のセルの開始ボタンをクリックすると、タイマーが起動し、ラベルの変更が開始されます。次にスクロールすると、別のセルのラベルも上のセルと同じになりますそのタイマが開始される。
この問題を解決する最善の方法は何ですか?
@Tom Harringtonの答えの代わりに、タイマーをデータソースと結合することをおすすめします。 –