1

如果我使用标准动画从表中删除一行,例如UITableViewRowAnimationFade 代码崩溃并出现此错误:

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

如果我删除动画线,行删除/删除工作,但我不再有很酷的 Apple 删除过渡。

这是我的代码 - 任何帮助表示赞赏。这种删除行的方法在iOS4之前有效,不确定是否发生了变化?

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    // If row is deleted, remove it from the list.
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row inSection:0];
        MyItem *myItem = [self.getItemsFetchedResultsController objectAtIndexPath:path];
        [dataRepository deleteItem:myItem];

        // If I comment this line out the delete works but I no longer have the animation
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

        [self.tableView reloadData];

    }

}

资料库

-(void)deleteItem:(MyItem *)myItem {
    [self.managedObjectContext deleteObject:myItem];
    [self saveCurrentContext];
}
4

2 回答 2

4

我通过在表更新前后使用此代码解决了这个问题:

[tableView beginUpdates];
if (editingStyle == UITableViewCellEditingStyleDelete) {
    ... 
}
[tableView endUpdates];
于 2010-11-25T14:38:17.970 回答
0

造成这种情况的一个原因可能是如果您已经设置NSFetchedResultsControllerDelegate并实现controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:了它将在您保存上下文并代表您更新表视图时调用。你可能有这样的代码:

case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

通常,当您收到错误时,这意味着您没有按照您指定的方式更新数据源deleteRowsAtIndexPaths:withRowAnimation:。当您调用该方法时,您保证您已经更新了数据源以反映该更改。

于 2010-11-25T12:04:41.250 回答