2012-05-01 8 views
6

Tengo una vista de tabla en la que las celdas se construyen de forma diferente dependiendo de si la tabla está editando o no. Específicamente, el estilo de selección es ninguno cuando está en modo de edición y azul cuando no está en modo de edición.Redrawing UITableViewCell al entrar/salir del modo de edición

Cuando paso de una a otra, noté que algunas de las celdas no están actualizadas. Un poco de registro rápido me dice que aunque la apariencia de las celdas cambia drásticamente (las vistas accesorias se agregan/eliminan correctamente, por ejemplo), la vista de tabla no actualiza el estilo de selección (ni tampoco el texto).

¿Qué está pasando aquí? ¿Se actualizan algunos atributos de la celda cuando se llama a setEditing? Presumiblemente solo aquellos con un método específico que permite la asignación de un estilo de vista separado (por ejemplo, el EditingAccessoryType)? Supongo que me beneficiaría de un EditingSelectionStyle.

¿Cómo debo resolverlo? ¿Al personalizar setEditing para cambiar el selectionStyle para cada celda? Ni siquiera estoy seguro de cómo iteraría a través de la vista de tabla para hacer esto. reloadData no es una opción debido a algunas animaciones que estoy usando.

Respuesta

6

Encontré que personalizar setEditing: iterar a través de las celdas visibles y establecer el estilo de selección para que cada uno funcione bien.

- (void)setEditing:(BOOL)editing animated:(BOOL)animated{ 
    [super setEditing:editing animated:animated]; 

    for (UITableViewCell *cell in [self.tableView visibleCells]) { 
      NSIndexPath *path = [self.tableView indexPathForCell:cell]; 
      cell.selectionStyle = (self.editing && (path.row > 1 || path.section == 0)) ? UITableViewCellSelectionStyleNone : UITableViewCellSelectionStyleBlue; 
    } 
} 
+7

¿Por qué harías eso en lugar de anular setEditing: animado: en la celda? – jrturton

+0

Gracias @jrturton, tu respuesta es más elegante. – xialin

+0

@jrturton, ¿puedes agregar tu comentario como respuesta? – phatmann

2

Si mira el UITableViewDelegate documentation, verá que hay cinco métodos para personalizar el comportamiento de edición. También existe el método

- (BOOL)tableView:(UITableView *)tableView 
canEditRowAtIndexPath:(NSIndexPath *)indexPath 

en el UITableViewDataSource documentation que se llamará en cada célula antes de entrar en el modo de edición. Lo mismo es cierto para

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView 
      editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 

que se llamará para todas las celdas que se pueden editar. Si desea cambiar la apariencia de las celdas, puede hacerlo en cualquiera de estos. (No implementar canEditRow.. asume todas las filas son editables.)


También tenga en cuenta que puede haber otras maneras de entrar en el modo de edición, como deslizar en una celda, en cuyo caso

   - (void)tableView:(UITableView *)tableView 
willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath 

se llamará para la célula que robaste en:

al entrar en este "golpe eliminar" el modo de edición, la vista de tabla envía una tableView: willBeginEditingRowAtIndexPath: mensaje al delegado para que pueda ajustarlo s interfaz de usuario.

+0

Esta información es útil, pero realmente no aborda la cuestión. Quiero saber si necesito personalizar setEditing: para recorrer todas las visiblesCells y establecer el estilo de selección, ya que no se actualiza automáticamente mediante setEditing: - la respuesta es sí, sí. –

+0

Sí, la única personalización que sucede automáticamente es que el contentView de tableViewCell se redimensiona cuando aparecen los deleteButtons. Si desea personalizar algo más, debe implementar uno o más de estos métodos. –

+0

Aunque noté que la etiqueta de texto también se actualiza automáticamente. –

0

Esto funciona en Swift 2.3, simplemente sobrescribir el método setEditing en la subclase de celda personalizado:

class MyCell: UITableViewCell { 

    override func setEditing(editing: Bool, animated: Bool) { 
     super.setEditing(editing, animated: animated) 
     //Place your code here... 
    } 

} 
Cuestiones relacionadas