问题描述
我有一个由 FetchResultController 管理的 tableview。 假设 fetch 请求给了我 99 个对象。 我想在索引 20 处添加一个额外的单元格(广告)。 就像我的数据由 FetchResultController 管理一样,我必须在 numberOfRows 中播放才能显示或不显示我的广告。但是 CoreData 在 tableView.endUpdates() 的末尾似乎很困惑。
'Invalid update: invalid number of rows in section 1. The number of rows contained in an existing section after the update (100) must be equal to the number of rows contained in that section before the update (0),plus or minus the number of rows inserted or deleted from that section (99 inserted,0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in,0 moved out).'
我尝试在 tableView.beginUpdate() 和 tableView.endUpdate() 之间添加一行
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>,didChange anObject: Any,at indexPath: IndexPath?,for type: NSFetchedResultsChangeType,newIndexPath: IndexPath?)
但 tableView 似乎只关心 NSFetchedResultController 何时驱动插入和删除行。
有人有想法吗?
解决方法
那不是核心数据错误,而是你的表视图告诉你它很困惑。 UITableView
会仔细跟踪它应该显示的行数。它询问有多少行。插入或删除行时,从 tableView(_:numberOfRowsInSection:)
返回的行数正确更改至关重要。
这意味着,如果您调用 insertRows(at:with:)
并插入一些行,则 tableView(_:numberOfRowsInSection:)
返回的值必须 增加相同的数字。这些消息告诉您的是:
- 表格视图询问显示多少行,你返回0
- 您在更新中插入了 99 行
- table view询问要显示多少行,你返回了100
这就是问题所在。你从 0 开始,加上 99,然后声称结果是 100。如果你想多出一行,你需要在更新过程中再插入一行。如果你不想插入行,你需要确保当表视图询问行数时,你说的是 99 而不是 100。