TableView NSFetchedResultsController CoreData:错误

Posted

技术标签:

【中文标题】TableView NSFetchedResultsController CoreData:错误【英文标题】:TableView NSFetchedResultsController CoreData: error 【发布时间】:2021-03-11 18:49:52 【问题描述】:

我有一个由 FetchResultController 管理的 tableview。 假设获取请求给了我 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 何时驱动插入和删除行。

有人有想法吗?

【问题讨论】:

请出示相关代码。 【参考方案1】:

这不是核心数据错误,这是您的表格视图告诉您它很困惑。 UITableView 仔细跟踪它应该显示的行数。它询问有多少行。当您插入或删除行时,从tableView(_:numberOfRowsInSection:) 返回的行数正确更改至关重要。

这意味着,如果您调用insertRows(at:with:) 并插入一些行,则tableView(_:numberOfRowsInSection:) 返回的值必须增加相同的数字。这些消息告诉您的是:

    表格视图询问要显示多少行,您返回 0 您在更新中插入了 99 行 表格视图询问再次显示多少行,您返回 100

这就是问题所在。您从 0 开始,添加 99,然后声称结果为 100。如果您想拥有额外的行,则需要在更新期间再插入一行。如果您不想插入行,则需要确保当表格视图询问行数时,您说的是 99 而不是 100。

【讨论】:

嗨,汤姆,感谢您的回复!问题是我在更新期间没有插入行,NSFetchedResults 委托触发了 didChange 方法并给了我 NSFetchedResultsChangeType : .insert。我遵循 Apple 默认实现,所以我只有这一行:tableView.insertRows(at: [indexPath], with: .fade) 我检查了 numberOfRowsInSection 并且它总是发回很多行。由于我的广告可以显示或不显示,我将尝试将此广告添加到一个部分的 footerView 中,并获得包含 20 封邮件的第一部分和其余行的第二部分 如果您在更新期间调用insertRows,那么您将在更新期间插入行。 Apple 的默认实现不包括您的广告单元,但您的代码需要以一种或另一种方式考虑。您的错误消息表明您没有从numberOfRowsInSection 返回正确的结果——这就是错误消息的字面意思。

以上是关于TableView NSFetchedResultsController CoreData:错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用tableview外的按钮将tableview移动到新的tableview

tableView(cellForRowAtIndexPath) 与 tableView.cellForRowAtIndexPath()?

TableView里面的tableview cell swift 3

将 tapGesture 添加到 tableView 则无法执行 tableView(_ tableView: UITableView, didSelectRowAt indexPath: Index

Swift:tableView 行的高度,其 tableView 单元格具有动态行数的嵌套 tableView

IOS:两个tableview的tableview委托方法