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

この理由の 1 つは、コンテキストを保存してテーブル ビューを更新するときに呼び出されるように設定NSFetchedResultsControllerDelegateして実装した場合です。controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:次のようなコードがあるかもしれません:

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

通常、エラーが発生した場合は、 で指定した方法でデータ ソースを更新していないことを意味しますdeleteRowsAtIndexPaths:withRowAnimation:。そのメソッドを呼び出すと、その変更を反映するようにデータ ソースが既に更新されていることが保証されます。

于 2010-11-25T12:04:41.250 に答える