我有一个 UITableView,它显示城市列表以及这些城市的当前时间,我使用计时器对其进行更新。
我开始像这样初始化时间:
clockTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { [self] t in
let myTime = Date().formatted(date: .omitted, time: .standard)
for i in 0 ..< cities.count {
let cityGMTDiff = cities[i].gmtDiff
let overallGMTDiff = cityGMTDiff - myGMTDiff
let cityTime = Date().addingTimeInterval(Double(overallGMTDiff) * 3600.0).formatted(date: .omitted, time: .standard)
cities[i].time = cityTime
}
citiesTableView.reloadData()
}
我还实现了使用此委托方法删除 TableView 行的功能:
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
cities.remove(at: indexPath.row)
citiesTableView.deleteRows(at: [indexPath], with: .automatic)
}
}
但是,当我尝试删除一行时,计时器会更新 TableView,从而阻止我完成删除行操作。
我尝试在选择一行后立即使计时器无效,但我怀疑这不是处理此问题的正确方法。
显然问题是每 0.5 秒调用一次
reloadData
。这可以防止与表视图的交互很少。
我能想到一些可能的解决方案。
当计时器触发时,获取可见行的单元格。迭代单元格并告诉每个单元格用当前时间更新自身。这使用的开销要少得多,并且避免使用
reloadData
并允许用户滑动以删除行。
执行标准时钟应用程序在“世界时钟”选项卡上执行的操作。仅允许在编辑模式下删除。在编辑模式下,您不会显示时间,这意味着您在编辑模式下不会调用
reloadData
。