使用CoreData在UITableView中动画行删除会导致断言失败

gle*_*rey 8 iphone cocoa-touch core-data uitableview

我有一个UITableView,显示与CoreData一起存储的对象列表.我可以使用以下代码删除对象:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
    NSLog(@"Delete row");
    [managedObjectContext deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];

    // Save the context.
    NSError *error;
    if (![managedObjectContext save:&error]) {
        /*do this gracefully one day */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    [self refreshTables]; //where refreshTables just reloads the data the table is using and calls [self.tableView reloadData];
}

}
Run Code Online (Sandbox Code Playgroud)

但它没有动画或美学.

当我尝试通过替换动画

[self refreshTables]; 
Run Code Online (Sandbox Code Playgroud)

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

我收到以下错误:

断言失败 - [UITableView _endCellAnimationsWithContext:],> /SourceCache/UIKit_Sim/UIKit-1261.5/UITableView.m:920 2010-10-30 16:46:35.717 MyApp [38226:207] *由于未捕获异常而终止应用程序'NSInternalInconsistencyException ',reason:'无效更新:第0节中的行数无效.更新后的现有部分中包含的行数(3)必须等于更新前该部分中包含的行数(3),加上或减去从该部分插入或删除的行数(插入0,删除1).

我已经尝试在commitEditingStyle代码中的各种位置使用deleteRowsAtIndexPaths代码而没有运气(例如在从mOC中删除对象之前)但我似乎无法解决此错误.

我知道Apple的iPhoneCoreDataRecipes示例通过设置FetchedResultsController的委托处理编辑/删除行来处理问题,但是在开发的这个阶段,如果可能的话,我只想要一个简单的解决方案来动画那些被删除的对象.

在从managedObjectContext中删除对象之前/之后,如何设置行的删除动画?

编辑:我已经尝试在从mOC中删除项目之前和之后使用deleteRowsAtIndexPaths,但具有相同的错误.

Rob*_*bin 17

当我们使用NSFetchedResultsController作为UITableView的DataSource时,我们无法deleteRowsAtIndexPaths: withRowAnimation: 在函数中调用tableView: commitEditingStyle: forRowAtIndexPath:,这将引发异常,如上所述.

解决这个问题的一种方法是通过调用[self.tableView reloadData]controllerDidChangeContent:从协议NSFetchedResultsControllerDelegate.它实际上解决了,不再有删除淡入淡出动画.

因此,替代简便的方法是通过调用[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]controller: didChangeObject: atIndexPath: forChangeType: newIndexPath:.

示例代码如下:


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
   forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Delete NSManagedObject
    NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
    [context deleteObject:object];

    // Save
    NSError *error;
    if ([context save:&error] == NO) {
        // Handle Error.
    }
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject 
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type 
      newIndexPath:(NSIndexPath *)newIndexPath
{
    if (type == NSFetchedResultsChangeDelete) {
        // Delete row from tableView.
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                              withRowAnimation:UITableViewRowAnimationFade];
    }
}
Run Code Online (Sandbox Code Playgroud)


gle*_*rey 7

1)我建立了一个正确的代表.

2)我在viewWillLoad中删除了一个调用[self.tableview reloadData]; 这是(奇怪的)弄乱一切(这篇文章给了我一个线索,寻找和删除:核心数据中的严重应用程序错误与fetchedResultsContainer).