gpt4 book ai didi

ios - 在 UITableView 中保持时间戳标签更新

转载 作者:行者123 更新时间:2023-11-29 05:19:33 25 4
gpt4 key购买 nike

我有一个 UIViewController,它有一个 UITableView,它显示从实时 Firebase 数据库获取的评论。

每次收到新评论时,我都会打电话

tableView.beginUpdates()
tableView.insertRows(at: [IndexPath(row: self.liveComments.count-1, section: 0)], with: .fade)
tableView.endUpdates()

插入带有淡入淡出动画的最新评论。这很好用。

但是,每个单元格都有一个标签,以“秒、分钟或小时前”的形式显示发布时间。问题是,当许多评论到达时,年龄标签不会更新,因为现有单元格没有更新,并且在用户看来评论年龄是错误的。

我尝试过打电话

tableView.reloadRows(at: self.tableView.indexPathsForVisibleRows ?? [], with: .none)

在我的 tableView 更新 block 内,但动画全乱了,因为所有可见单元格似乎都以一种奇怪的“跳跃”方式进行动画处理。

我还尝试获取所有可见单元格,并调用它们的方法来手动更新其时间戳标签,但是当我这样做时会崩溃,所以我想不建议这样做:

if let visibleCells = self.tableView.visibleCells as? [LiveCommentTableViewCell] {
visibleCells.forEach { cell in
cell.updateCommentAgeLabel()
}

我该如何解决这个问题?我只需要重新加载所有不带动画的可见单元格,以及最后一个带有淡入动画的单元格。谢谢!

最佳答案

我只需重新加载所有数据,只要 cellForRowAt 正确设置时间戳标签,它应该可以正常工作:

// still do your nice animation
tableView.beginUpdates()
tableView.insertRows(at: [IndexPath(row: self.liveComments.count-1, section: 0)], with: .fade)
tableView.endUpdates()
// now just refresh the entire table
tableView.reloadData()

当然,您需要确保在调用 reloadData() 之前为 numberOfItemsInSection 提供的任何集合也已更新,假设您已经这样做了否则你会遇到很多错误和崩溃

显然,请确保编辑 UI 的代码也在主线程上。

话虽这么说,您的 cell.updateCommentAgeLabel() 函数看起来像 bc ,理论上它也可以工作,除非可能不会再次在主线程上调用它或者强制转换不起作用.

也许尝试告诉系统您希望它进行布局传递:

if let visibleCells = self.tableView.visibleCells as? [LiveCommentTableViewCell] {
visibleCells.forEach { cell in
cell.updateCommentAgeLabel()
cell.layoutIfNeeded() // either this
}
tableView.layoutIfNeeded() // OR this at the end, I dont expect you'll need to do both but not sure if both work

关于ios - 在 UITableView 中保持时间戳标签更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58807248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com