NSFetchedResultsController:删除1行使应用程序崩溃

inv*_*ent 2 core-data uitableview nsfetchedresultscontroller ios

从NSFetchedResultsController提供的UITableView中删除行会导致我的应用程序崩溃.

错误是:

*断言失败 - [UITableView _endCellAnimationsWithContext:],/ SourceCache/UIKit/UIKit-2903.23/UITableView.m:1330
*
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0部分中的行数无效.更新(1)后现有部分中包含的行数必须等于更新(1)之前该部分中包含的行数,加上或减去从该部分插入或删除的行数(插入0) ,1删除)并加上或减去移入或移出该部分的行数(0移入,0移出).

我只想滑动删除.我的删除代码如下:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{  
    [self.tableView beginUpdates];  
    SequenceData *sd = [self.fetchedResultsController objectAtIndexPath:indexPath];  
    [self.managedObjectContext deleteObject:sd];  
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                          withRowAnimation:UITableViewRowAnimationFade];  
    [self.tableView endUpdates];  
}
Run Code Online (Sandbox Code Playgroud)

我的NSFetchedResultsController的设置就像Ray Wanderlich的教程(http://www.raywenderlich.com/999/core-data-tutorial-for-ios-how-to-use-nsfetchedresultscontroller)

行数由以下因素确定:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {    
    id sectionObjects = [[self.fetchedResultsController sections] objectAtIndex:section];  
    NSInteger nbObjects = [sectionObjects numberOfObjects];  
    return nbObjects;  
}
Run Code Online (Sandbox Code Playgroud)

看起来fetch没有更新(行数不变).我是否需要取自己(这不是由fetch控制器处理)?

显然我在这里缺少一些基本的东西.不要犹豫,建议基本答案.

我首先用控制器实现了这个:didChangeObject:...方法.错误是一样的,但有些细节不同.

编辑 我相信我的问题已修复.这两个答案(来自CX和Martin)帮助我找到了答案.马丁得到了答案,因为解释有助于我更好地理解......

Mar*_*n R 12

不要打电话

[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
Run Code Online (Sandbox Code Playgroud)

如果您使用获取的结果控制器.仅删除对象

[self.managedObjectContext deleteObject:sd];
Run Code Online (Sandbox Code Playgroud)

然后自动调用获取的结果控制器委托方法 didChangeObject:,并调用deleteRowsAtIndexPaths:.

因此,在您的情况下,该行被删除了两次,这导致了异常.

请注意,您不需要beginUpdates/ endUpdateshere.