2009-06-19 10 views
21

Estoy usando la idea GenericTableViewController de Matt Gallagher para controlar mi UITableViews. Mi fuente de datos es NSFetchedResultsController.¿Cómo puedo hacer deleteRowsAtIndexPaths: trabajar con GenericTableViewController?

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

todo está funcionando bien, hasta que lo intente eliminar una célula.

tengo el siguiente código en mi Vista Controlador:

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

La última línea se estrella con la explicación más detallada en la consola:

*** 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, entiendo lo que está diciendo. ... una fila no se borra (supongo) porque no estoy reenviando un mensaje al lugar correcto (ya que he movido un código de su ubicación "normal") ... ¿alguien tiene alguna idea de cuál? Estoy totalmente perplejo en este caso.

Respuesta

67

Bueno, bah. Acabo de encontrar this respuesta, que no es lo mismo, pero me llevó en la dirección correcta. Dejaré esto aquí para que cualquier persona en el futuro tenga problemas similares.

La clave es envolver los deleteRowsAtIndexPaths con empezar y fin, y forzar el modelo de actualizar en el mismo bloque, lo que resulta en:

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

Esto hizo que el problema desaparezca, y las animaciones a funciona perfectamente.

+4

+1 Muchas gracias por la respuesta. –

+2

Tiene permiso para modificar el origen de datos antes del bloque de animación. El error que vio indica que no ha cambiado la fuente de datos antes de animar la eliminación. Asegúrese de que la fuente de datos esté en el estado final (después de las eliminaciones) antes de animar la eliminación de esas filas. – Mark

+0

Siempre me olvido de esto ... ¿por qué el código de la plantilla XCode no incluye estas líneas? – Echelon

Cuestiones relacionadas