我需要实现一种通知中心,其中PUSH通知按部分按日期在UITableView中排序。我使用CoreData来存储通知。 Apple有一个很好的example,它演示了如何实现它。但是,添加或删除新行时,它不会处理此情况。在这个例子中,我得到了例外,特别是,如果从多个部分一次删除多行
错误:严重的应用程序错误。在调用-controllerDidChangeContent:期间,从NSFetchedResultsController的委托中捕获到异常。无效更新:无效的节数。更新后的表视图中包含的节数(3)必须等于更新前的表视图中包含的节数(4),加上或减去插入或删除的节数(0插入,0删除)。 with userInfo(null)
这可能是核心数据实体中瞬态属性的问题......有没有人面临这个问题?提前致谢。
My FetchedResultsControllerDelegate方法如下所示:
// ----------------------------------------------------------------------------------------------
// MARK: - FetchedResultsController
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}
func controller(controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) {
switch type {
case .insert:
tableView.insertSections(NSIndexSet(index: sectionIndex) as IndexSet, with: .fade)
case .delete:
tableView.deleteSections(NSIndexSet(index: sectionIndex) as IndexSet, with: .fade)
case .move:
break
case .update:
break
}
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type {
case .insert:
tableView.insertRows(at: [newIndexPath! as IndexPath], with: .fade)
case .delete:
tableView.deleteRows(at: [indexPath! as IndexPath], with: .fade)
case .update:
let cell = tableView.cellForRow(at:indexPath!)
if(cell != nil) {
let messageCell : LPMessageCell = cell! as! LPMessageCell
configure(cell: messageCell, atPath: indexPath!)
}
case .move:
if(!self.tableView.isEditing) {
tableView.moveRow(at: indexPath! as IndexPath, to: newIndexPath! as IndexPath)
}
break
}
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.endUpdates()
}