2016-12-22 46 views
0

我有一個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單元不能正確回收。例如,如果我點擊頂部單元格上的開始按鈕,定時器開始運行,它的標籤將開始變化,然後如果我向下滾動標籤以查看另一個單元格,它也將變爲與頂部單元格相同,而沒有它的計時器正在啓動。

解決此問題的最佳方法是什麼?

+0

作爲@Tom Harrington的答案的替代方案,我建議將您的計時器與您的數據源相結合。 –

回答

1

這聽起來像細胞正在正確地重新使用。細胞再利用的想法是,當一個實例UITableViewCell滾動屏幕時,當另一端需要一個新的細胞時,再次使用該確切的實例。你正在一個單元中啓動一個定時器,該單元被重用,並且因爲它是同一個對象,它具有相同的定時器,它已經在運行。如果您設計一個具有某種狀態的單元格(例如,正在運行的計時器),則需要在單元格被重用時重置該狀態,否則它將保持不變。

如果您打算在單元中保留一個定時器,您需要安排在單元重用時停止並重新啓動定時器。您可以通過在表格單元格類中重寫prepareForReuse來停止計時器,以便在單元格重用時永不會有運行計時器。要重新啓動它們,您必須讓表格視圖數據源跟蹤哪些單元格具有運行計時器,以便在出現單元格時啓動計時器。

相關問題