计时器未在UITableView iOS中更新

时间:2019-03-08 07:40:56

标签: ios swift uitableview

如图所示,我正在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])
        })
    }

如何在带有实时倒计时的表格视图中显示计时器?

1 个答案:

答案 0 :(得分:0)

表单元格未更新,因为在millisecondsClock创建的计时器没有所有者对象,并且被ARC删除。您应该以与存储myList相同的方式将计时器存储在视图控制器中。您可以在https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

中找到有关ARC的更多信息。

您也不应该将UILabel传递到millisecondsClock方法中,因为UITableView将单元格重用。这意味着相同的单元格和该单元格内的UILabel可以多次使用以在不同的索引路径处呈现连续性。在您的情况下,这意味着多个计时器可能会同时更新同一标签。我认为您应该在计时器块中使用func cellForRow(at indexPath: IndexPath) -> UITableViewCell?来获取正确的单元格来更新时间。