私は奇妙な問題を抱えており、助けが必要です。
私はコアデータプロジェクトに参加しており、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でこれ以上のことは見つかりません...
何か案が?