2009-08-23 11 views
5

Tengo una UITableView con UITableViewCells de color alternante. Y la tabla se puede editar: las filas se pueden reordenar y eliminar. ¿Cómo actualizo las celdas alternando el color de fondo, cuando las filas se reordenan o eliminan?Actualizando UITableViewCells de color alternativo cuando las filas se reordenan o eliminan

estoy usando esto para extraer las células de colores alternantes:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ([indexPath row] % 2) { 
     // even row 
     cell.backgroundColor = evenColor; 
    } else { 
     // odd row 
     cell.backgroundColor = oddColor; 
    } 
} 

Pero este método no está siendo llamada cuando una fila se reordena o se elimina. Y no puedo llamar [tableView reloadData] desde el siguiente método, porque se bloquea la aplicación en un bucle infinito:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
    // Move the object in the array 
    id object = [[self.list objectAtIndex:[fromIndexPath row]] retain]; 
    [self.list removeObjectAtIndex:[fromIndexPath row]]; 
    [self.list insertObject:object atIndex:[toIndexPath row]]; 
    [object release]; 

    // Update the table ??? 
    [tableView reloadData]; // Crashes the app in an infinite loop!! 
} 

¿Alguien tiene un puntero o una mejor solución prácticas para hacer frente a la cuestión de la reordenación de las células de color alternas?

Gracias

Respuesta

5

Se utiliza una llamada retardada para realizar la recarga si no se puede llamar a ese método:

[tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.0f]; 

Espera hasta después de que se termine su método actual antes de que llama recarga.

+0

Gracias! Eso hace el truco. –

0

[tableView reloadData] recibirá su mesa de fondos de vuelta en el ritmo de las cosas. Su otra opción es intercambiar los colores de fondo de todas las celdas visibles desde el índice de acceso del índice más bajo en el movimiento hasta el más alto en visibleCells.

3

La recarga es demasiado pesada; Escribí AltTableViewController que solo cambia el color de fondo de las celdas y debería funcionar más rápido.

+0

¡Gracias, funcionó de maravilla! –

1

Tomé todas las subvistas UITableViewCell de la tabla vista y ordené esa matriz en función de las celdas frame.origin.y para que volvieran a estar en el orden correcto. Luego hice un bucle cambiando el color de fondo según el índice == 0 || índice% 2 == 0 volviéndolos a colorear. Parece que funciona mejor que volver a cargar TableView ya que estaba causando que la animación se sacudiera. Funcionó para mí a la 1:25 a.m.

4

No es necesario utilizar objetos de terceros ni cargar/actualizar todo el dataSource. Simplemente use las herramientas adecuadas en su cuchillo suizo:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if(editingStyle == UITableViewCellEditingStyleDelete) { 
     //1. remove your object 
     [dataSource removeObjectAtIndex:indexPath.row]; 

     //2. update your UI accordingly 
     [self.myTableView beginUpdates]; 
     [self.myTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight]; 
     [self.myTableView endUpdates]; 

     //3. obtain the whole cells (ie. the visible ones) influenced by changes 
     NSArray *cellsNeedsUpdate = [myTableView visibleCells]; 
     NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; 
     for(UITableViewCell *aCell in cellsNeedsUpdate) { 
      [indexPaths addObject:[myTableView indexPathForCell:aCell]]; 
     } 

     //4. ask your tableview to reload them (and only them) 
     [self.myTableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; 

    } 
} 
+1

'NSArray * indexPaths = [self.tableView indexPathsForVisibleRows];' lo salva de un bucle for innecesario. – user3099609

0

Esto funciona bien. Comience el patrón en el último índice en lugar del primero. De esta manera cada célula siempre conserva su fondo:

if (dataSource.count - indexPath.row) % 2 == 0 { 
     cell.backgroundColor = UIColor.grayColor() 
    } else { 
     cell.backgroundColor = UIColor.whiteColor() 
    } 

probé las otras soluciones, pero no estaba completamente satisfecho. Esta solución no es un truco y ni siquiera agrega otra línea de código.

Cuestiones relacionadas