我有一个tableview谁是由FetchResultController管理。假设取回请求给我99个对象。我想添加一个额外的单元格(广告)在索引20。就像我的数据是由FetchResultController管理的,我必须在numberOfRows中显示或不显示我的广告。但CoreData似乎在tableview . endpdates()的末尾感到困惑。
'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 . endpdate()之间添加一行
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?)
但是tableView似乎只关心NSFetchedResultController何时驱动插入和删除行
谁有主意?
这不是Core Data错误,这是你的表视图告诉你它混淆了。UITableView
保持仔细跟踪的行数,它应该显示。它问有多少行是"多"当您插入或删除行时,从tableView(_:numberOfRowsInSection:)
返回的行数必须正确更改,这一点至关重要。
这意味着,如果调用insertRows(at:with:)
并插入一些行,tableView(_:numberOfRowsInSection:)
返回的值必须增加相同的数字。这些消息告诉你的是:
- 表视图询问要显示多少行,而您返回0
- 您在更新 中插入了99行
- 表视图询问要再次显示多少行,而您返回100
这就是问题所在。你从0开始,加99,然后声称结果是100。如果希望获得额外的行,则需要在更新期间再插入一行。如果您不想插入行,则需要确保当表视图询问行数时,使用99而不是100。