Pregunta ¿Cómo puedo desactivar el resaltado de selección UITableView?


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


1074
2017-10-10 11:32


origen


Respuestas:


Para mí, lo siguiente funcionó bien:

tableView.allowsSelection = NO;

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

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


496
2017-07-22 16:56



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

C objetivo:

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 su vista de tabla, delegue o excluya explícitamente las celdas en las que no desea tener acción si lo implementa.

Más información aquí y aquí


1829
2017-10-10 13:22



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 deseados:

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Utilizo esto cuando tengo un UIButton - o algún otro control (s) - alojado en una UITableViewCell y quiero que el usuario pueda interactuar con los controles pero no con la propia celda.

NOTA: Como Tony Million señaló anteriormente, esto NO previene tableView:didSelectRowAtIndexPath:. Lo soluciono con simples afirmaciones "si", que con mayor frecuencia prueban la sección y evitan las acciones para una sección en particular.

Otra forma en que pensé para probar el tapping 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 mi prueba, esto todavía permite controles dentro del UITableViewCell ser interactivo.


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

[cell setUserInteractionEnabled:NO];



4.Para hacer que toda una tabla sea de "solo lectura"

[tableView setUserInteractionEnabled:NO];



5. Para determinar sobre la marcha si resaltar una celda (que según esta respuesta implícitamente incluye selección), puede implementar lo siguiente UITableViewDelegate método de protocolo:

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

333
2018-06-10 11:08



Para resumir lo que creo que son las respuestas correctas basadas en mi propia experiencia al implementar esto:

Si desea desactivar la selección solo para algunas de las celdas, use:

cell.userInteractionEnabled = NO;

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

Si tiene botones en sus celdas que necesitan un clic, en su lugar debe:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

y también debe ignorar cualquier clic en la celda de - (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!)


75
2018-06-01 13:32



A partir de iOS 6.0, UITableViewDelegate tiene tableView:shouldHighlightRowAtIndexPath:. (Lea sobre esto en iOS Documentación.)

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


49
2017-10-31 21:48



También puede deshabilitar la selección de la fila desde el propio constructor de interfaz eligiendo NoSelection desde el selection opción (de UITableView Properties) en el panel de inspector como se muestra en la imagen de abajo

UITableView Inspector


45
2018-04-25 13:13



SOLUCIÓN FIJA PARA SWIFT 3 

cell.selectionStyle = .none

42
2018-01-07 19:15



En caso de que alguien necesite una respuesta para Rápido:

cell.selectionStyle = .None

33
2017-12-02 09:39



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

didSelectRowAtIndexPath

el seguimiento

[tableView deselectRowAtIndexPath:indexPath animated:YES];

por lo que parpadeará el estado seleccionado y revertirá.


31
2017-11-13 15:07