如图所示,我正在tableView中为每个单元格使用倒数时间。
TableView with Countdown timer
如果我将以下代码用于控制器中的简单标签,则一切正常。
var duration = 0.0
func clock(){
Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { [weak self](Timer) in
guard let strongSelf = self else { return }
strongSelf.duration -= 0.01
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .positional
formatter.allowedUnits = [.hour,.minute,.second]
formatter.zeroFormattingBehavior = .pad
strongSelf.timerLabel.text = formatter.string(from: strongSelf.duration)
})
}
但是,如果我为tableViewCell写类似的内容,则只会显示值,而不会更新它们。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier:"myTimer", for: indexPath) as? UITableViewCell
let label = cell?.contentView.viewWithTag(13) as? UILabel
milisecondsClock(index: indexPath.row, label: label!)
return cell!
}
func milisecondsClock(index: Int,label: UILabel){
Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { [weak self](Timer) in
guard let strongSelf = self else { return }
strongSelf.myList[index] -= 0.01
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .positional
formatter.allowedUnits = [.hour,.minute,.second]
formatter.zeroFormattingBehavior = .pad
label.text = formatter.string(from: strongSelf.myList[index])
})
}
如何在带有实时倒计时的表格视图中显示计时器?
答案 0 :(得分:0)
表单元格未更新,因为在millisecondsClock
创建的计时器没有所有者对象,并且被ARC删除。您应该以与存储myList
相同的方式将计时器存储在视图控制器中。您可以在https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html
您也不应该将UILabel
传递到millisecondsClock
方法中,因为UITableView
将单元格重用。这意味着相同的单元格和该单元格内的UILabel
可以多次使用以在不同的索引路径处呈现连续性。在您的情况下,这意味着多个计时器可能会同时更新同一标签。我认为您应该在计时器块中使用func cellForRow(at indexPath: IndexPath) -> UITableViewCell?
来获取正确的单元格来更新时间。