删除多行时如何实现 NSFetchedResultsController 委托?

Posted

技术标签:

【中文标题】删除多行时如何实现 NSFetchedResultsController 委托?【英文标题】:How to implement NSFetchedResultsController delegate when multiple row is on deletion? 【发布时间】:2014-10-07 10:09:48 【问题描述】:

两个项目被删除。

func controller(controller: NSFetchedResultsController!, didChangeObject anObject: AnyObject!, atIndexPath indexPath: NSIndexPath!, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath!) 

    switch(type) 
    case .Delete:

        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    default:
        break
    

在删除行我收到此错误:

CoreData:错误:严重的应用程序错误。异常被捕获 在核心数据更改处理期间。这通常是一个错误 NSManagedObjectContextObjectsDidChangeNotification 的观察者。 无效更新:第 0 节中的无效行数。 更新 (0) 后包含在现有节中的行必须是 等于该节之前包含的行数 update (2),加或减插入或删除的行数 该部分(0 插入,1 删除)和加或减的数量 移入或移出该部分的行(0移入,0移出)。和 用户信息(空)

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:无效 第 0 节中的行数。包含在第 0 节中的行数 更新后的现有节(0)必须等于 更新之前该部分中包含的行 (2),加号或减号 从该部分插入或删除的行数(0 插入, 1 已删除)并加上或减去移入或移出的行数 该部分(0 移入,0 移出)。'

【问题讨论】:

【参考方案1】:

您还需要通过实现 controllerWillChangeContentcontrollerDidChangeContent 委托方法来“批量”更新,如下所示(尽管很抱歉这些是 Obj-c):

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
    [self.tableView beginUpdates];


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
    [self.tableView endUpdates];

【讨论】:

以上是关于删除多行时如何实现 NSFetchedResultsController 委托?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 不会在使用 NSFetchedResultsController 更改模型时重新加载

EasyUI datagrid 如何默认选择多行

如何用js删除表格一行或者多行

WPF DataGrid 如何对选择的多行进行删除

如何删除多行?

QTableWidget 在删除多行时崩溃