什么 tableView.reloadRows(at: [indexPath], with: .none) 会像这样崩溃?

Posted

技术标签:

【中文标题】什么 tableView.reloadRows(at: [indexPath], with: .none) 会像这样崩溃?【英文标题】:What would tableView.reloadRows(at: [indexPath], with: .none) to crash like this? 【发布时间】:2018-09-11 16:15:05 【问题描述】:

我试图弄明白 Fabric 中的一个错误:

无效更新:第 0 节中的行数无效。更新后现有节中包含的行数 (40) 必须等于更新前该节中包含的行数 (20),加上或减去从该节插入或删除的行数(1 插入,1 删除),加上或减去移入或移出该节的行数(0 移入,0 移出)。 专门的 NewInboxViewController.tableView(UITableView, didSelectRowAt : IndexPath)

发生在didSelectRow:AtIndexPath的这条线上:

tableView.reloadRows(at: [indexPath], with: .none)

表格视图行为是:

视图模型加载 20 行 当用户滚动到表格视图的 70% 时,我们再加载 20 行,isDownloading bool 切换为 true,调用完成时设置为 false,然后重新加载表格视图 can commit edits 为假,isDownloading 为真,否则用户可以滑动删除行 当用户拉动刷新时,我们会清除存储在数组中的单元格被拉出的所有内容,并替换为来自 API 调用的 20 个最近的项目(已编辑)

【问题讨论】:

【参考方案1】:

您告诉表视图重新加载一行,但您向数据模型添加了 20 行新行。这就是错误的意思。它说:

“在您调用 reloadRows 之前,数据模型中有 20 行。现在我看到数据模型中有 40 行,但您只是告诉我重新加载(插入和删除)1 行。”

您应该调用 tableView.insertRows(at:) 并使用一个包含 20 个新索引路径的数组,每个新添加的行对应一个。

【讨论】:

谢谢@rmaddy。这似乎是一种竞争条件,其中loadMore 操作在用户选择对话的同时完成。我重新加载该单行的原因是将其样式从未读更新为已读。由于这发生在didSelectRow:atIndexPath,不知何故我需要弄清楚如何说,“刚刚加载了一堆新的吗?如果是,做一些特别的事情,否则,重新加载行。”有什么建议吗? 您需要展示相关代码以获得更具体的帮助。编辑您的问题,显示添加所有新行的位置以及需要重新加载一行的代码。 如果viewModel.isDownloading == true,我想我可以通过不执行reloadRows 来解决这个问题。因为该 fetch 操作将刷新 table view 并提供所需的 UI 效果。那应该可以解决竞争条件

以上是关于什么 tableView.reloadRows(at: [indexPath], with: .none) 会像这样崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

Swift tableView.reloadRows 删除单元格

tableView.reloadRows(at:[indexPath],带有:.none)会像这样崩溃吗?

什么数据 -# UNPACK #- !Size !a !(Set a) !(Set a) 在 Haskell 中意味着什么

C语言中a【10】啥意思?

a:active的作用是什么简单介绍

o和a是啥意思啊?