2011-10-22 8 views
8

iOS 5 finalmente agregó un método moveRowAtIndexPath:toIndexPath: al UITableView. El problema es que al llamarlo solo mueve la fila, no la actualiza/vuelve a dibujar. La única forma de hacerlo es encontrar la celda y llamar a setNeedsDisplay directamente. Pero esto es complicado ya que nunca se sabe si la celda ya se movió o no.moveRowAtIndexPath no actualiza el contenido de la celda

Tampoco puedo llamar al reloadRowsAtIndexPaths:, ya que no puedo tener 2 animaciones aplicadas a una sola fila dentro del mismo bloque beginUpdates-endUpdates.

Hay algunas soluciones que se me ocurren, como dividir todo en 2 bloques de animación. Pero me pregunto si me estoy perdiendo algo, ya que todo el comportamiento me parece extraño.

+0

No estoy seguro, pero prueba y mira 'beginUpdates' y' endUpdates'. Es posible que pueda rastrear el indexPath que se está moviendo y hacer el cambio apropiado a la celda en 'endUpdates' si se movió. – runmad

+0

Llamar a cualquier nueva función de animación de fila después de que endUpdates cancela las animaciones pendientes para esa celda. En otras palabras, la celda se vuelve a dibujar, pero la animación de movimiento ya no se lleva a cabo. Llamar a 'setNeedsDisplay' tiene un efecto similar. – samvermette

+0

Se ha guardado un informe de error: http://openradar.appspot.com/10457435 – samvermette

Respuesta

14

finalmente recibió una respuesta oficial de Apple con respecto a este tema:

Ingeniería ha determinado que este problema se comporta como se esperaba en base en la siguiente información:

Sólo inserción y actualización hacen que la célula sea solicitado de la fuente de datos (la primera porque es nueva y la segunda porque le dijo explícitamente a la vista de tabla que actualice la celda). Eliminar y mover no actualiza los contenidos porque eso no está implícito en la acción que se está realizando. Si necesita cambiar el contenido de la celda durante la actualización, simplemente busque en la celda y cambie el contenido.

2

Les gusta lo que hace difícil para nosotros no se ;-)

case NSFetchedResultsChangeUpdate: 
     [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
     break; 

    case NSFetchedResultsChangeMove: 
     // old API 
     //[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     //[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 

     // new API 
     [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:newIndexPath]; // note use of newIndexPath 
     [tableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath]; // NS_AVAILABLE_IOS(5_0); 
     break; 

Nota en el ChangeMove, configureCell tiene diferentes parametros en comparación con su uso en ChangeUpdate así que tenga cuidado si copia pegar. Es bastante complicado hacerlo bien.

Cuestiones relacionadas