Ich bin eben mal wieder auf einen komischen Fehler gestoßen dessen Lösung ich euch nicht vorenthalten möchte.
Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (2) must be equal to the number of rows contained in that section before the update (2), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted).’
Doch wie kommt es zu solch einem Fehler? Ganz einfach: Ich habe versucht eine Zeile der aktuellen TableView zu löschen. Hier hat alles bis auf folgende Zeile funktioniert:
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
Was ist jetzt jedoch an dieser Zeile falsch? Warum funktioniert es nicht so eine Zeile aus der Tabelle zu löschen? Die Lösung ist erdenklich einfach. Es stimmt alles mit dieser Zeile, zumal die Vorgabe bei einer neu erstellten TableViewController-Klasse eine ähnliche ist.
Liegt der Fehler dann eventuell im Rückgabewert der numberOfRowsInSection Methode? Zumindest lässt die Fehlermeldung darauf schließen. Und genau das war auch mein Ansatzpunkt um zur folgenden funktionierenden Lösung zu kommen:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
id selectedObjectForDelete = [self.results objectAtIndex:indexPath.row];
// Delete selected picoguard from database.
[self loadDatabase];
[self.db beginTransaction];
[self.db executeUpdate:@"delete from myTable where id = ?",
[NSString stringWithFormat:@"%d", [selectedObjectForDelete valueForKey:@"id"]]];
[self.db commit];
// Remove result for current indexPath row.
[self.results removeObjectAtIndex:indexPath.row];
// Update table view to show only the Rows which are left.
[self.tableView beginUpdates];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
}
}
Der springende Punkt in diesem Code ist, dass wir als erstes vor dem Methodenaufruf deleteRowsAtIndexPaths die entsprechende Zeile aus dem results-Stack löschen. Erst wenn wir das gemacht haben, können wir aus der Tabelle selber die Zeile ausfaden lassen.
[self.results removeObjectAtIndex:indexPath.row];
Und wieder einmal ist viel kostbare Zeit für solch eine doch recht simple Lösung drauf gegangen
Ich hoffe, dass ihr dadurch schneller zum Ergebnis kommt, solltet ihr auf den gleichen oder einen ähnlichen Fehler stoßen.