所以我有一个tableViewController,可以执行列表,删除和编辑等基本操作。基本上,tableViewController列出来自核心数据的东西,使用辅助字典来获取所有对象,然后列出它们。一切正常。我可以列出所有对象,选择它们,加载它们,一切都很好并且具有正确的值。除此之外,当我尝试删除中间行然后删除此tableViewController的最后一行时,它崩溃了,而且我大多肯定它会在tableView.deleteRows(at: [indexPath], with: .fade)
上崩溃。
注意:如果我按顺序删除所有项目,从最后一个到第一个,它不会崩溃
我已经找到了类似的解决方案,但所有解决方案都numberOfRowsInSection
应该使用之前提到的辅助字典.count
来保留现有行的初始值(In代码如下)
这是我得到的错误(再次,我已经查了一下,我总是达到相同的解决方案,我认为这不是我的情况下发生的事情):
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (4) must be equal to the number of rows contained in that section before the update (4), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'
一些代码:
我的词典的定义,名为lists
:
var lists = [Int : [Product]]()
然后定义行数:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return lists.count
}
然后,崩溃的地方:
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
lists.removeValue(forKey: indexPath.row) //Deletes the entry on dictionary
deleteProductWithId(row: indexPath.row) //Deletes from the core-data
tableView.deleteRows(at: [indexPath], with: .fade) //Crashes here
//tableView.reloadData()
} else if editingStyle == .insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
任何人都知道我可能做错了什么?
提前致谢
答案 0 :(得分:1)
注意:如果我按顺序删除所有项目,从最后一个到第一个,它不会崩溃
那是因为当你不按顺序删除它们时,你刚刚删除的行下面的单元格的索引路径会发生变化,但你的字典键不会更新以反映出来。
解决方案:不要缓存索引路径(在您的情况下为索引路径的行)。他们一定会改变。不要混合模型标识符和视图标识符。
答案 1 :(得分:1)
首先,不要对Tableview使用字典,因为当tableview需要有序数据时,字典是无序的。其次是你的字典的数量仍然是4,因为lists.removeValue(forKey: indexPath.row)
只会将该值设置为nil而不是删除整个密钥对。您需要删除此案例的整个密钥对
此表单中的用户数组
var lists = [[Product]]()
然后在cellfor row中简单地说:
lists[indexPath.row]
并删除行:
lists.remove(at:indexPath.row)