2009-06-19 18 views
21

Używam pomysłu Matta Gallaghera na GenericTableViewController do kontrolowania mojego UITableViews. Moje źródło danych to NSFetchedResultsController.Jak mogę zrobić deleteRowsAtIndexPaths: pracować z GenericTableViewController?

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

Wszystko działa dobrze, dopóki próbuję usunąć komórkę.

Mam następujący kod w moim zdaniem kontrolera:

- (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]; 
    } 
} 

Końcowa linia wywala się z dość gadatliwym wyjaśnienie w konsoli:

*** 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, rozumiem, co ona mówi. .. wiersz nie jest usuwany (jak zakładam), ponieważ nie przekazuję wiadomości we właściwe miejsce (skoro przeniosłem kod z jego "normalnej" lokalizacji) ... ktoś ma jakiś pomysł, który? Jestem całkowicie zdumiony tym.

Odpowiedz

67

Cóż, bah. Właśnie znalazłem odpowiedź this, która nie jest taka sama, ale doprowadził mnie do właściwego kierunku. Zostawię to tutaj, aby ktokolwiek w przyszłości miał podobne kłopoty.

Kluczem jest owinąć deleteRowsAtIndexPaths z rozpoczęciem i znaczników końcowych i zmusić model aktualizacji w tym samym bloku, w wyniku:

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

To spowodowało problem odejść, a animacje działa idealnie.

+4

+1 Dziękuję bardzo za odpowiedź. –

+2

Możesz modyfikować źródło danych przed blokiem animacji. Błąd, który zobaczyłeś, oznacza, że ​​nie zmieniłeś źródła danych przed animacją usunięcia. Upewnij się, że źródło danych znajduje się w stanie końcowym (po usunięciu), zanim animujesz usuwanie tych wierszy. – Mark

+0

Zawsze zapominam o tym ... dlaczego kod szablonu XCode nie zawiera tych linii? – Echelon

Powiązane problemy