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)
在您当前的实现中,单元格只是一个本地创建的变量。这不是您想要的单元格。
我尝试使用此代码在每次时间更改一分钟时更新自定义单元格的 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)
在您当前的实现中,单元格只是一个本地创建的变量。这不是您想要的单元格。