iOS - UITableView Delete Row w/CoreData & Animation
31 Oct 2011
Tags: iOS iphone iphone programming iOS development uitableview coredata core data uitableview delete rowI found something very important that doesn’t seem well documented, when working with editable tables and CoreData. When you are using tableView:commitEditingStyle:forRowAtIndexPath: you must not actually delete the row in that method.
For example, this will crash your app with an NSInternalConsistency error:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
[[self tableView] deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
It will work if you use UITableViewRowAnimationNone, but crashes with animation. If you are using CoreData, use this instead:
- (void) controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
[[self tableView] deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
That will delete the row(s) as this method is called by CoreData after whatever block you pass it happens. Your table will refresh properly and won’t have issues after this.