UILabel 不会随计时器更新

UILabel Will Not Update with Timer

我尝试使用此代码在每次时间更改一分钟时更新自定义单元格的 uilabel 的时间。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { [weak self] _ in
        if let s = self, let tableView = s.tableView, let indexPaths = tableView.indexPathsForVisibleRows {
            for indexPath in indexPaths {
                guard let cell = tableView.dequeueReusableCell(withIdentifier: "PersonCell", for: indexPath) as? PersonCell else { return }
                let person = s.people[indexPath.section]
                cell.time.attributedText = dateIn(timeZone: person.timeZone)
            }
        }
    })
}

这是 return 当前时间作为 NSAttributedString 的 dateIn 函数:

func dateIn(timeZone: TimeZone) -> NSMutableAttributedString {
let dateFormatter: DateFormatter = DateFormatter()
var now: Date {
    return Date()
}
// The styles of the dateformatter are configured to show only the time
dateFormatter.dateStyle = .none
dateFormatter.timeStyle = .short
dateFormatter.timeZone = timeZone

// Returns time in chosenTimeZone as a string
let date = dateFormatter.string(from: now)

// The AM/PM is attributed so it can have a smaller font size than the time
let attributedTime = NSMutableAttributedString(string: "\(removeAmPm(from: date))")
let attributedAmPm = amPmAttributed(from: date)
attributedTime.append(attributedAmPm)

    return attributedTime
}

Time 是一个 UILabel,它是 PersonCell class 的一部分。出于某种原因,UILabel 的内容不会在时间更改时更新,尽管 dateIn(timeZone: person.timeZone) 的值确实发生了更改(我使用打印语句对其进行了检查)。我在整个互联网上找遍了,但找不到除了使用 reloadData() 以外的其他有效解决方案,我不确定它是否对内存和速度有好处。

您必须调用另一个函数来更改所需单元格中的值。

使用这个

let cell = tableView.cellForRow(at: indexPath)

在您当前的实现中,单元格只是一个本地创建的变量。这不是您想要的单元格。