2009-06-19 3 views
21

Ich benutze Matt Gallagher GenericTableViewController Idee zur Steuerung meiner UITableViews. Meine Datenquelle ist NSFetchedResultsController.Wie kann ich deleteRowsAtIndexPaths machen: Arbeit mit GenericTableViewController?

http://cocoawithlove.com/2008/12/heterogeneous-cells-in.html

Alles funktioniert gut, bis ich versuche, eine Zelle zu löschen.

Ich habe den folgenden Code in meinem View Controller:

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

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     // Delete the managed object. 
     NSManagedObjectContext *context = [wineryController managedObjectContext]; 
     [context deleteObject:[wineryController objectAtIndexPath:indexPath]]; 

     NSError *error; 
     if (![context save:&error]) { 
      // Handle the error. 
     } 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
} 

Die letzte Zeile stürzt mit der ziemlich ausführlichen Erklärung in der Konsole:

*** 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 (5) must be equal to the number 
of rows contained in that section before the update (5), plus or minus the number 
of rows inserted or deleted from that section (0 inserted, 1 deleted).'

OK, ich verstehe, was es sagt. ..eine Zeile wird nicht gelöscht (würde ich annehmen), weil ich keine Nachricht an den richtigen Ort weiterleite (da ich etwas Code von seinem 'normalen' Ort verschoben habe) ... hat jemand eine Idee welche? Ich bin total ratlos.

Antwort

67

Nun, bah. Ich habe gerade this Antwort gefunden, die nicht das gleiche ist, aber hat mich in die richtige Richtung geleitet. Ich werde das hier für jeden in der Zukunft mit ähnlichen Problemen verlassen.

Der Schlüssel ist die DeleteRowsAtIndexPaths mit Anfang und Ende-Tags zu wickeln, und zwingt das Modell innerhalb des gleichen Blockes zu aktualisieren, in resultierenden:

[tableView beginUpdates]; 
[self constructTableGroups]; 
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
     withRowAnimation:UITableViewRowAnimationFade]; 
[tableView endUpdates]; 

Dies ist das Problem verursacht weg zu gehen, und die Animationen arbeite einfach perfekt.

+4

+1 Vielen Dank für die Antwort. –

+2

Sie dürfen die Datenquelle vor dem Animationsblock ändern. Der angezeigte Fehler weist darauf hin, dass Sie die Datenquelle vor dem Löschen nicht geändert haben. Stellen Sie sicher, dass sich die Datenquelle im endgültigen Status (nach den Löschvorgängen) befindet, bevor Sie das Entfernen dieser Zeilen animieren. – Mark

+0

Ich vergesse das immer ... warum enthält der XCode Vorlagencode diese Zeilen nicht? – Echelon

Verwandte Themen