我有一个带有UITableView
的应用,其数据会定期更新。如果数据接收到新元素,则重新加载表视图。假设表格视图中有10个可见单元格,但其中只有2个是数据。用户已沿任一方向滚动,但未从触摸中释放表格视图。如果用户向上滚动,则他们可能已经隐藏了第一个单元格,只有第二个单元格可见。然后,接收一个新元素并调用reloadData。无需等待释放表视图进行更新,而是立即更新表视图并将contentOffset
重置为0。在用户滚动而不释放时,tableView只是重置到开始位置。
我在单独的Xcode项目中尝试了类似的设置,但此问题并未出现。我想知道会有什么不同。
这是一些代码:
对于ViewController
的{{1}}:
dataSource
通过DataManager
func viewDidLoad() {
super.viewDidLoad()
//some other code
DataManager.shared.onElementReceival = { [weak self] in
guard let self = self else { return }
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return DataManager.shared.data.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
cell.textLabel?.textColor = .white
cell.backgroundColor = .clear
if let name = DataManager.shared.data[indexPath.row].name {
cell.textLabel?.text = name
} else {
cell.textLabel?.text = "Unnamed"
}
return cell
}
答案 0 :(得分:0)
尝试使用以下方法仅重新加载单元格:
UIButton
在您的示例中:
tableview.insertRowsAtIndexPaths([IndexPath(forRow: Yourarray.count-1, inSection: 0)], withRowAnimation: .Automatic)
从DataManager
let onElementReceival:(IndexPath) -> Void = { [weak self] inx in
guard let self = self else { return }
DispatchQueue.main.async {
tablview.beginUpdates()
tablview.insertRowsAtIndexPaths(at: [inx], with: .automatic)
tablview.endUpdates()
}
}