¿Cómo puedo deshabilitar el resaltado de la selección de UITableView?

Cuando toca una fila en un UITableView , la fila se resalta y se selecciona. ¿Es posible deshabilitar esto para que tocar una fila no haga nada?

Para mí, lo siguiente funcionó bien:

tableView.allowsSelection = NO;

Esto significa que didSelectRowAt# simplemente no funcionará. Es decir, tocar una fila de la table, como tal, no hará absolutamente nada. (Y, por lo tanto, obviamente, nunca habrá una animation seleccionada).

(Tenga en count que si, en las celdas, tiene un UIButton o cualquier otro control, por supuesto, esos controles seguirán funcionando. Cualquier control que tenga en la celda de la tabla no está relacionado con la capacidad de UITableView para permitirle "seleccionar una fila "usando didSelectRowAt# .)

Todo lo que tiene que hacer es establecer el estilo de selección en la instancia de UITableViewCell utilizando:

C objective:

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

o

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

Swift 2:

 cell.selectionStyle = UITableViewCellSelectionStyle.None 

Swift 3:

 cell.selectionStyle = .none 

Además, asegúrese de que no implemente -tableView:didSelectRowAtIndexPath: en la vista de tabla delegue o excluya explícitamente las celdas que desea que no tengan ninguna acción si la implementa.

Más información aquí y aquí

Debido a que he leído esta publicación recientemente y me ha ayudado, quería publicar otra respuesta para consolidar todas las respuestas (para la posteridad).


Entonces, en realidad hay 5 respuestas diferentes dependiendo de su lógica y / o resultado deseado:

1.Para desactivar el resaltado azul sin cambiar ninguna otra interacción de la celda:

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

Utilizo esto cuando tengo un UIButton u otro control (s) alojado en un UITableViewCell y quiero que el usuario pueda interactuar con los controles, pero no con la propia célula.

NOTA : Como Tony Million señaló anteriormente, esto NO impide que tableView:didSelectRowAtIndexPath: Obtengo esto con declaraciones simples "si", con frecuencia probando para la sección y evitando la acción para una sección en particular.

Otra forma en que pensé en probar el toque de una celda como esta es:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // A case was selected, so push into the CaseDetailViewController UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; if (cell.selectionStyle != UITableViewCellSelectionStyleNone) { // Handle tap code here } } 

2. Para hacer esto para una tabla completa, puede aplicar la solución anterior a cada celda de la tabla, pero también puede hacer esto:

 [tableView setAllowsSelection:NO]; 

En mis testings, esto todavía permite que los controles dentro de UITableViewCell sean interactivos.

3. Para hacer una celda "de solo lectura", simplemente puede hacer esto:

 [cell setUserInteractionEnabled:NO]; 

4. Para hacer una tabla completa "de solo lectura"

 [tableView setUserInteractionEnabled:NO]; 

5. Para determinar si desea resaltar una celda (que de acuerdo con esta respuesta incluye implícitamente la selección), puede implementar el siguiente método de protocolo UITableViewDelegate :

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

Para resumir lo que creo son las respuestas correctas basadas en mi propia experiencia en la implementación de esto:

Si desea deshabilitar la selección para algunas de las celdas, utilice:

 cell.userInteractionEnabled = NO; 

Además de evitar la selección, esto también detiene tableView: didSelectRowAtIndexPath: se llama a las celdas que lo han configurado. (El crédito es para Tony Million por esta respuesta, ¡gracias!)

Si tiene botones en las celdas que deben hacer clic, debe:

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

y también debe ignorar cualquier clic en la celda en - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath .

Si desea deshabilitar la selección para toda la tabla, use:

 tableView.allowsSelection = NO; 

(Crédito a Paulo De Barros, ¡gracias!)

A partir de iOS 6.0, UITableViewDelegate tiene tableView:shouldHighlightRowAtIndexPath: (Lea sobre esto en la documentation de iOS.)

Este método le permite marcar filas específicas como insuficientes (e implícitamente, no seleccionables) sin tener que cambiar el estilo de selección de una celda, ensuciar el event handling events de la celda con userInteractionEnabled = NO o cualquier otra técnica documentada aquí.

También puede deshabilitar la selección de la fila desde el propio generador de interfaces eligiendo NoSelection en la opción de selection (de las Propiedades UITableView) en el panel del inspector como se muestra en la image a continuación

Inspector UITableView

En caso de que alguien necesite una respuesta para Swift :

 cell.selectionStyle = .None 

SOLUCIÓN FIJA PARA SWIFT 3

 cell.selectionStyle = .none 

Si desea que la selección solo parpadee, no permanezca en el estado seleccionado, puede llamar, en

 didSelectRowAtIndexPath 

el seguimiento

 [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

por lo que destellará el estado seleccionado y se revertirá.

Desde el Protocolo UITableViewDelegate puede usar el método willSelectRowAtIndexPath y return nil si no desea que se select la fila.

De la misma manera, puede usar el método willDeselectRowAtIndexPath y return nil si no desea que la fila se deselect.

Esto es lo que uso:

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

En cellForRowAtIndexPath escriba este código.

En su UITableViewCell UITableViewCell, en el inspector de attributes, establezca el valor de Selection en None .

introduzca la descripción de la imagen aquí

Intente escribir:

 cell.selected = NO; 

Se anulará la selección de su fila cuando sea necesario.

En Swift3 …

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let r = indexPath.row print("clicked .. \(r)") tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true) } 

He estado luchando con esto muy profusamente también, tener un control en mi UITableViewCell prohibió el uso de la propiedad userInteractionEnabled . Tengo una tabla estática de 3 celdas para configuraciones, 2 con dates, 1 con un interruptor de encendido / apagado. Después de jugar en Storyboard / IB he logrado hacer que el inferior no sea seleccionable, pero cuando lo tocas desaparece la selección de una de las filas superiores. Aquí hay una image WIP de mis configuraciones UITableView:

Configuraciones UITableView

Si toca la 3ª fila, no sucede nada, la selección permanecerá en la segunda fila. La funcionalidad es prácticamente una copy de la pantalla de selección de time de evento de adición de la aplicación Calendario de Apple.

El código es sorprendentemente compatible, hasta IOS2 = /:

 - (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == 2) { return nil; } return indexPath; } 

Esto funciona junto con configurar el estilo de selección en ninguno, por lo que la celda no parpadea en los events de toque hacia abajo.

para una rápida deselección

 cell.selectionStyle = .None 

C objective:

  1. Debajo del fragment deshabilita el resaltado pero también deshabilita la llamada a didSelectRowAtIndexPath. Entonces, si no está implementando didSelectRowAtIndexPath, utilice el siguiente método. Esto debería agregarse cuando crea la tabla. Sin embargo, esto funcionará en los botones y TextField dentro de la celda.

     self.tableView.allowsSelection = NO; 
  2. Debajo del fragment inhabilita el resaltado y no deshabilita la llamada a didSelectRowAtIndexPath. Establezca el estilo de selección de celda a Ninguno en cellForRowAtIndexPath

     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
  3. Debajo del fragment inhabilita todo en la celda. Esto deshabilitará la interacción con botones, campos de text:

     self.tableView.userInteractionEnabled = false; 

Rápido

A continuación se muestra el equivalente Swift de las soluciones de Objective-C anteriores:

  1. Sustitución de la primera solución

     self.tableView.allowsSelection = false 
  2. Sustitución de la segunda solución

     cell?.selectionStyle = UITableViewCellSelectionStyle.None 
  3. Sustitución de la tercera solución

     self.tableView.userInteractionEnabled = false 

Solo tienes que poner este código en cellForRowAtIndexPath

Para deshabilitar la propiedad de selección de la celda: (Mientras presiona la celda).

 cell.selectionStyle = UITableViewCellSelectionStyle.None 

Podemos escribir código como

  cell.selectionStyle = UITableViewCellSelectionStyleNone; 

pero cuando tenemos celda personalizada xib por encima de la línea avise en ese momento para

celda personalizada xib

necesitamos establecer el estilo de selección None en el generador de interfaces

Estoy usando esto, que funciona para mí.

 cell?.selectionStyle = UITableViewCellSelectionStyle.None 

testing esto

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

y

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

y también puede configurar el estilo de selección utilizando interfacebuilder.

Si bien esta es la solución mejor y más fácil para evitar que una fila muestre el resaltado durante la selección

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

También me gustaría sugerir que ocasionalmente sea útil mostrar brevemente que la fila ha sido seleccionada y luego apagarla. Esto alerta a los usuarios con una confirmación de lo que pretendían seleccionar:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:NO]; ... } 

También puede establecer el color de background en Clear para lograr el mismo efecto que UITableViewCellSelectionStyleNone , en caso de que no desee / no pueda usar UITableViewCellSelectionStyleNone .

Usaría un código como el siguiente:

 UIView *backgroundColorView = [[UIView alloc] init]; backgroundColorView.backgroundColor = [UIColor clearColor]; backgroundColorView.layer.masksToBounds = YES; [cell setSelectedBackgroundView: backgroundColorView]; 

Esto puede degradar su performance al agregar una vista de color extra a cada celda.

Puedes usar ….

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
 UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; [cell setSelected:NO animated:NO]; [cell setHighlighted:NO animated:NO]; 

¡Feliz encoding!

También puedes hacerlo desde el guión gráfico. Haga clic en la celda de vista de tabla y en el inspector de attributes en Celda de vista de tabla, cambie el menu desplegable junto a Selección a Ninguno.

Solución rápida con celda personalizada:

 import Foundation class CustomTableViewCell: UITableViewCell { requinetworking init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) self.selectionStyle = UITableViewCellSelectionStyle.None } } 

Puede usar la propiedad selectionStyle de UITableViewCell

  cell.selectionStyle = UITableViewCellSelectionStyleNone; 

O

  [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

Además, no ejecute a continuación el delegado

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... } 

Si ha creado el file Xib / Storyboard, puede cambiar la propiedad setUserInteractionEnabled de tableview a No desmarcándolo. Esto hará que su vista de tabla sea de solo lectura.

Para deshabilitar el resalte de la UItableviewcell

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

Y no debe permitir que el usuario interactúe con la célula.

 cell.userInteractionEnabled = NO; 

Puedes usar esto

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

La mejor solución sería Hacer la selección Estilo Ninguno

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

Sin embargo, aquí estamos considerando el hecho de que no hay imágenes personalizadas usadas para el estado seleccionado.