| 

.NET C# Java Javascript Exception

1
Hallo zusammen,

ich entwickle aktuell eine iPad-Variante von meiner iPhone-App und stehe nun vor folgendem Problem:

In meiner App nutze ich eine TableView um Daten aus einem CoreData-Modell anzuzeigen. Über eine "Bearbeiten"-Schaltfläche können neue Datensätze hinzugefügt oder nicht mehr benötigte gelöscht werden.
Beim Hinzufügen rufe ich einen UIViewController über folgenden Code auf:

AddKapitelViewController *addKapitelViewController = [[AddKapitelViewController alloc] initWithNibName:@"AddKapitelViewController" bundle:nil];
addKapitelViewController.geschichten = geschichten;
UINavigationController *addKapitelController = [[UINavigationController alloc] initWithRootViewController:addKapitelViewController];
[addKapitelController setModalPresentationStyle:UIModalPresentationFormSheet];
[self.navigationController presentModalViewController:addKapitelController animated:YES];


In diesem UIViewController füge ich anschließend einen neuen Datensatz in mein CoreData-Modell ein. Anschließend blende ich den TableView wieder über folgende Zeile im UIViewController ein:

[self.navigationController dismissModalViewControllerAnimated:YES];


Nun das Problem: Der TableView wird nicht aktualisiert! Verlasse ich nun noch den "Bearbeiten"-Modus des TableView per Klick auf die gleichnamige Schaltfläche, stürzt die App mit folgender Fehlermeldung ab:

2011-06-07 20:06:06.794 Writing App[796:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 3. 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).'


Der Absturz erfolgt in folgender Methode an der fett markierten Stelle:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
[super setEditing:editing animated:animated];
[self.navigationItem setHidesBackButton:editing animated:YES];

[self.tableView beginUpdates];

NSUInteger kapitelCount = [geschichten.kapitel count];
NSUInteger charaktereCount = [geschichten.charaktere count];
NSUInteger orteCount = [geschichten.orte count];

NSArray *kapitelInsertIndexPath = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:kapitelCount inSection:1]];
NSArray *charaktereInsertIndexPath = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:charaktereCount inSection:2]];
NSArray *orteInsertIndexPath = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:orteCount inSection:3]];

if (editing) {
[self.tableView insertRowsAtIndexPaths:kapitelInsertIndexPath withRowAnimation:UITableViewRowAnimationTop];
[self.tableView insertRowsAtIndexPaths:charaktereInsertIndexPath withRowAnimation:UITableViewRowAnimationTop];
[self.tableView insertRowsAtIndexPaths:orteInsertIndexPath withRowAnimation:UITableViewRowAnimationTop];
} else {
[self.tableView deleteRowsAtIndexPaths:kapitelInsertIndexPath withRowAnimation:UITableViewRowAnimationTop];
[self.tableView deleteRowsAtIndexPaths:charaktereInsertIndexPath withRowAnimation:UITableViewRowAnimationTop];
[self.tableView deleteRowsAtIndexPaths:orteInsertIndexPath withRowAnimation:UITableViewRowAnimationTop];
}

[self.tableView endUpdates];

if (!editing) {
NSManagedObjectContext *context = geschichten.managedObjectContext;
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}


Leider weiß ich an dieser Stelle nicht, wie ich das Problem lösen kann. Auffällig ist noch folgendes: Wenn ich beim Aufruf des UIViewControllers (siehe oben) die fett markierte Zeile ([addKapitelController setModalPresentationStyle:UIModalPresentationFormSheet];) auskommentiere (und damit der UIViewController im Vollbild aufgerufen wird) tritt dieses Problem nicht auf und die TableView wird korrekt aktualisiert!

Bereits im Voraus vielen Dank für eure Unterstützung, ich weiß aktuell einfach nicht weiter.

Beste Grüße,
Thomas

PS: Solltet ihr weitere Infos benötigen gebt mir einfach Bescheid, dann poste ich sie entsprechend!
07.06.2011
Sillivan 479 6
2 Antworten
1
Hast Du dein Modell angepasst? Die Fehlermeldung sagt, dass nach dem Editieren eine Zeile entfernt wurde, aber immer noch zwei Zeilen von der DataSource geliefert werden. Aus dem Modell müssen die Zeilen auch entfernt werden, nicht nur aus der TableView.

Grundsätzlich würde ich die Tabellenänderungen eher in die Delegatemethode

- (void)
tableView: (UITableView *) tableView
commitEditingStyle: (UITableViewCellEditingStyle) editingStyle
forRowAtIndexPath: (NSIndexPath *) indexPath


stecken, da das setEditing eigentlich nur für das Wechseln des Zustands und nicht für das Speichern und Durchführend der Änderungen da ist.

Der Fehler tritt erst im endUpdates auf, weil erst dann die TableView auf Konsistenz geprüft wird.

Viele Grüße,
Timm.
08.06.2011
theorist 494 5
0
Vielen Dank für deine Antwort! Ich bin in der Thematik noch nicht 100%ig fit, dein Tipp hat mir aber sehr weiter geholfen! :-)

Besten Dank dafür und viele Grüße,
Thomas
11.06.2011
Sillivan 479 6

Stelle deine Ios-Frage jetzt!