quitar efecto de selección en tableview

84 views
Skip to first unread message

miquelcamps

unread,
Aug 17, 2012, 6:26:13 AM8/17/12
to iosbo...@googlegroups.com
hola,

por defecto cuando selecciono una fila en un tableview se queda con el fondo azul y no se quita, encontre el apaño de poner:

[tableView deselectRowAtIndexPath:indexPath animated:YES];

en el evento
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

el caso es que este devuelve un warning "local declaration of tableview hides instance variable" hay alguna solución que no sea tan radical como:
cell.selectionStyle = UITableViewCellSelectionStyleNone;

ya que me interesa que quede seleccionada la fila pero por unos momentos..

gracias

Ruben

unread,
Aug 17, 2012, 6:40:38 AM8/17/12
to iosbo...@googlegroups.com
Miquel,

yo lo que haría es deshabitar el efecto de selección azul que viene por defecto.
Y para tener ese efecto de selección y deseleccion lo que haría seria establecer el color de una vista "background" de la celda cuando se selecciona y cambiar transcurrido un tiempo ese color animadamente. No se si me explico.

tu celda debería tener una vista de fondo por ejemplo:
celda.backgroundView

Luego cuando es seleccionada esa celda en
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// accedes a esa celda 
celda = [tableView cellForRowAtIndexPath:indexPath];
// y a continuacion haces 
celda.backgroundView.color = [UIColor blablabla];
//seguidamente
[UIView animateWithDuration blablabla animations:^{
celda.backgroundView.color = [UIColor clearColor];
}];
}


Algo así se me ocurre, lo mismo hay alguna forma mas eficiente, creativa, sencilla, yo que se.

Prueba y me dices.

Saludos,
Rubén Méndez

Daniel García

unread,
Aug 17, 2012, 10:28:54 AM8/17/12
to iosbo...@googlegroups.com
Buenas ! 

   Hay varias formas, pero lo más importante es tener claro un concepto : visualmente, es la celda la que se queda marcada al seleccionarla, pero la información de que esa celda está seleccionada, la almacena la tabla, no la celda en sí. 

La opción que te comenta Rubén es un poco : pasa de cómo lo implementa UITableView, y "do it yourself". Es tan válida como otra, especialmente si estás trabajando con celdas personalizadas, pero ya que preguntas específicamente por cómo hacerlo de la forma "oficial" te cuento.

La idea es que la tabla deje de seleccionar esa celda, así que puedes hacerlo de varias maneras: 

1. En tableView:didSelectRowAtIndexPath: 
     Justo después de que se inicie el push del navigation (suponiendo que estás haciendo navegación), puedes llamar a 
[tableView deselectRowAtIndexPath:indexPath animated:YES]; 
Esto eliminará, no sólo el aspecto visual de la celda seleccionada, sino que la tabla dejará de tener en cuenta esa celda como celda seleccionada.

2. En ViewWillAppear: 
      Otra opción es deseleccionarla cuando la tabla se vaya a mostrar nuevamente. Para ello tenemos que calcular el IndexPath de la celda seleccionada. Lo podemos hacer con 
NSIndexPath* selection = [self.tableView indexPathForSelectedRow];
if (selection) // Si hay alguna celda seleccionada, la deseleccionamos
[self.tableView deselectRowAtIndexPath:selection animated:YES];

Seguro que hay más formas , pero ya pillas la idea. Lo importante es decirle a la tabla que deje de seleccionar la celda. Ya que si intentases desactivar la seleccion de la celda sin decirle a la tabla nada, cuando hagas scroll y se vuelva a mostrar la celda, aparecería nuevamente seleccionada, ya que internamente la tabla marca como seleccionada la celda.

PD: Rubén, lo único que haría con el método que propones, es llevarmelo a la implementación de la celda, y usar la property "selected" de la celda. Incluso podría hacerse una combinación de lo que propongo y lo que tú propones, así tendrías un comportamiento custom, pero mantiene el comportamiento standard. En vez de desactivar la selección de celdas y emularla ;)
Reply all
Reply to author
Forward
0 new messages