0

私は奇妙な問題を抱えており、助けが必要です。

私はコアデータプロジェクトに参加しており、fetchedResultsControllerをまだ使用しておらず、fetchRequetsと配列を使用してzableviewsにデータを入力しています。だから今、私はFRCを変更して利用することにしました...

これまでのところすべてが非常に簡単でした...しかし、commitEditingStyleを使用すると、それ以来問題が発生します-行を削除すると、次のような例外がスローされます。

The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update.

結局、削除したいオブジェクトがFRCに残っているためだとわかりました...いくつかのNSLogセクションをlikoに配置しました。

    NSLog(@"Number before deleting: %i - deleting %@",[[fetchedResultsController fetchedObjects] count], [fetchedResultsController objectAtIndexPath:indexPath]);

    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    [context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];

    NSLog(@"Number before saving: %i",[[fetchedResultsController fetchedObjects] count]);

    NSError *error;
    if (![context save:&error]) {

        [NSException raise:NSGenericException format:@"Following error occured when trying to delete %@: %@", [fetchedResultsController objectAtIndexPath:indexPath], [error description]];
    }

    NSLog(@"Number after saving: %i",[[fetchedResultsController fetchedObjects] count]);

    NSArray * cellsToDelete = [NSArray arrayWithObject:indexPath];
    [tableView deleteRowsAtIndexPaths:cellsToDelete withRowAnimation:UITableViewRowAnimationFade];

結果はこれでした:

2011-05-20 14:49:35.398 Nivellator[6000:207] Number before deleting: 3
2011-05-20 14:49:35.399 Nivellator[6000:207] Number before saving: 3
2011-05-20 14:49:35.404 Nivellator[6000:207] Number after saving: 3

もちろん、テーブルビューに3行を取得するが、2行しか渡さないことを伝えていると、吐き気がします...しかし、ここで何が問題になっていますか?

私の古いコードはこのように見え、問題なく動作しました...

-(void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([tableView isEqual:self.entityTableView] == YES) {
        if (editingStyle != UITableViewCellEditingStyleDelete) {
            return;
        }

        if ([self.entityArray count] <= indexPath.row) {
            return;
        }

        Member *thisEntity = [self.entityArray objectAtIndex:indexPath.row];
        [delegate.managedObjectContext deleteObject:thisEntity];

        NSError *savingError = nil;

        if ([delegate.managedObjectContext save:&savingError] == YES) {

            // Remove the entity from the Array and delete the corresponding table cell with animation
            //
            [self.entityArray removeObject:thisEntity];

            NSArray * cellsToDelete = [NSArray arrayWithObject:indexPath];
            [tableView deleteRowsAtIndexPaths:cellsToDelete withRowAnimation:UITableViewRowAnimationFade];
        } else {
            /* Error handling missing */
        }
    }
}

わかった

結局、それはRTFMに帰着しました...それで私はそれを次のようなコードを変更することによって部分的に機能させました:

-(void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([tableView isEqual:self.entityTableView] == YES) {
        if (editingStyle != UITableViewCellEditingStyleDelete) {
            return;
        }

        NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
        [context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];

        NSError *error;
        if (![context save:&error]) {

            [NSException raise:NSGenericException format:@"Following error occured when trying to delete %@: %@", [fetchedResultsController objectAtIndexPath:indexPath], [error description]];
        }

        if ([fetchedResultsController performFetch:&error]) {

            [tableView beginUpdates];

            NSArray * cellsToDelete = [NSArray arrayWithObject:indexPath];
            [tableView deleteRowsAtIndexPaths:cellsToDelete withRowAnimation:UITableViewRowAnimationFade];

            [tableView endUpdates];
        } else {

            [NSException raise:NSGenericException format:@"Following error occured when trying to delete %@: %@", [fetchedResultsController objectAtIndexPath:indexPath], [error description]];
        }
    }
}

しかし、FRCでセクションを使用している場合でも、同じエラーが発生します...FRCでこれ以上のことは見つかりません...

何か案が?

4

1 に答える 1

0
  1. 削除後に FRC のキャッシュを削除します
  2. FRC のデリゲート メソッドが正しく実装されていることを確認してください。
  3. beginUpdatesFRC のデリゲート メソッドを実行する前に、必ず でテーブルビューをフリーズしてください。
于 2011-05-20T15:34:54.123 に答える