1

我已经完成了许多与 NSInternalInconsistencyException / NSFetchedResultsController 相关的问题/答案,但我找不到任何可以帮助我解决问题的东西。

在我的 TVC 中删除一行后出现此错误:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效

这是负责对数据源执行删除的方法

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [self.tableView beginUpdates];

        Role *roleToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
        NSLog(@"Deleting: %@", roleToDelete.name);
        [self.managedObjectContext deleteObject:roleToDelete];
        [self.managedObjectContext save:nil];
        // Delete the row from the data source
        // [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [self performFetch];

        [self.tableView endUpdates];
    }
}

我的异常断点在此方法的最后一行停止。奇怪的是调试器说我要删除两行,但我不是:

更新后现有节中包含的行数 (1) 必须等于更新前该节中包含的行数 (2),加上或减去从该节中插入或删除的行数(0 插入, 2 已删除)

下次我启动应用程序时,很明显只删除了一行。

以下是可能导致问题的其他方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [[self.fetchedResultsController sections] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
}
4

1 回答 1

2

如果插入、删除或更改对象,获取结果控制器 (FRC) 会自动更新表视图。因此,您只需要删除该对象:

Role *roleToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
[self.managedObjectContext deleteObject:roleToDelete];
[self.managedObjectContext save:nil];

其他所有内容 ( beginUpdates, deleteRowsAtIndexPaths:..., endUpdates) 都在 FRC 委托方法 ( controllerWillChangeContent:, didChangeObject:..., controllerDidChangeContent:) 中完成。也不应该调用performFetch.

在您的情况下,deleteRowsAtIndexPaths:...被调用两次:一次在您的commitEditingStyle:方法中,第二次在 FRC 委托方法didChangeObject:...中。这会导致“内部不一致异常”。

于 2013-07-16T07:33:22.997 回答