在UItableView中插入和删除按部分中的日期排序(核心数据)

时间:2017-09-08 13:13:06

标签: ios uitableview exception nsfetchedresultscontroller sections

我需要实现一种通知中心,其中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()
}

0 个答案:

没有答案