【问题标题】:Swift Firestore UITableView cellForRowAt downloadURL wrong cell in closureSwift Firestore UITableView cellForRowAt downloadURL错误的单元格关闭
【发布时间】:2021-11-18 13:17:26
【问题描述】:

为什么在 UITableView cellForRowAt 内部调用时单元格引用变得混乱: (单元格来自

guard let cell = tableView.dequeueReusableCell(withIdentifier: "venuepostcell")as? VenuePostTableViewCell else { return UITableViewCell()}

cell.tag = indexPath.row

sRef.downloadURL { downloadURL, error in
    if downloadURL != nil {
        print ("=== A \(indexPath.row)  \(cell.tag)")
        }
    }

cell.tag 应该始终等于 indexPath.row。

最初确实如此,但如果我有时刷新 indexPath.row 不等于 cell.tag ???

初始

===  3  3
===  0  0
===  1  1
===  2  2
===  4  4

但在刷新时它会恢复为

===  0  0
===  1  1
===  4  0 <-- WRONG
===  4  4
===  3  3
===  3  1 <-- WRONG
===  2  2
===  1  3 <-- WRONG
===  0  4 <-- WRONG
===  4  0 <-- WRONG

【问题讨论】:

  • 细胞被系统回收,downloadURL 是一个异步调用——我并不惊讶它会导致试图混合两者的意外结果。我建议您将下载移出单元格的逻辑并将其放在单独的位置。单元应该只负责显示数据,而不是对服务器进行异步调用。

标签: swift uitableview google-cloud-firestore


【解决方案1】:

这就是 UITableView 的实现方式。 sRef.downloadURL 是一个异步调用,这意味着在收到回调的时候,有可能用户滚动了表格视图并为单元格设置了一个全新的标签,而 indexPath.row 没有改变。

您可能必须更改实施此方法的方法。

【讨论】:

  • 谢谢。我知道 cell 被重用了,但忘记了你不能在 async 中使用它。在调用 cellForRowAt 或用 nil 填充单元格值时,我进行了重构并获得了所需的值。工作.. 感谢您的提醒!
猜你喜欢
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
相关资源
最近更新 更多