所以我有一个带有 TableView 的 View Controller 。这个 View Controller 有一个按钮,点击它会打开另一个 View Controller 。此 View Controller 上有一个按钮,可以更改 TableView 的数据集并关闭 View Controller 。
问题是当更改数据集并关闭它调用的 View Controller 时 cellForRowAt
。但是因为项目的数量有可能减少,所以我得到了一个 Index out of range
错误。
设置一些断点后,我意识到这是因为在更新和关闭 View Controller 后 cellForRowAt
被调用但 numberOfRowsInSection
没有。因此行数已更新,但未反射(reflect)在 TableView 中。
我可以检查 cellForRowAt
以查看它是否超出范围,如果超出范围则返回一个空单元格,但这似乎非常低效。尽管无论如何这都可能是个好主意,但在这种情况下似乎是一种创可贴修复。
那么我怎样才能有效且高效地解决这个问题呢?
最佳答案
有两种解决方案可以解决此问题。
更新数据集后,只需调用 reloadData在您的 tableView 上,它将重新加载所有数据。
如果删除了某些数据,则使用 deleteRows(at:with:)方法 。
用于单行删除
data.remove(at: index)
self.tableView.deleteRows(at: [indexPath], with: .fade)
多行插入删除
var indexPaths: [IndexPath] = []
for index in indexArray
data.remove(at: index)
indexPaths.append(IndexPath(item: index, section: 0))
}
if #available(iOS 11.0, *) {
self.tableView.performBatchUpdates({
self.tableView.deleteRows(at: indexPaths, with: .fade)
})
} else {
self.tableView.beginUpdates()
self.tableView.deleteRows(at: indexPaths, with: .fade)
self.tableView.endUpdates()
}
如果要删除多行,只需创建一个具有匹配行索引的索引路径数组,并将其传递给删除函数即可。
编辑: 仅对多个插入/删除/移动操作使用批量更新。根据苹果文档
UITableView 推迟任何行或部分的插入,直到它处理完行或部分的删除/插入。无论插入和删除方法调用的顺序如何,都遵循此顺序。
关于ios - UITableView cellForRowAt 在 numberOfRowsInSection 之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47767222/