什么 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 中意味着什么