Cuando toca una fila en a UITableView
, la fila se resalta y se selecciona. ¿Es posible deshabilitar esto, así que tocar una fila no hace nada?
ios
uitableview
cocoa-touch
DavidM
fuente
fuente
selection
, y por supuestohighlighting
se deshabilita con eso. Muchas respuestas altamente votadas explican cómodisable selection
y no aborda la desactivaciónhighlighting
. Para deshabilitar solo el uso de resaltadocell.selectionStyle = .None
o vaya astoryboard / cell / Selection = None
Respuestas:
Para mí, lo siguiente funcionó bien:
Esto significa que
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
u otros controles, por supuesto, esos controles seguirán funcionando. Cualquier control que tenga en la celda de la tabla no tiene ninguna relación con la capacidad de UITableView para permitirle "seleccionar una fila" usandodidSelectRowAt#
.)Otro punto a tener en cuenta es que: Esto no funciona cuando
UITableView
está en modo de edición. Para restringir la selección de celdas en el modo de edición, use el código de la siguiente manera:fuente
selectionStyle
propiedad en la celda:cell.selectionStyle = UITableViewCellSelectionStyle.None
en Swift ocell.selectionStyle = UITableViewCellSelectionStyleNone
en Objective-C.tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
desea que se llame,cell.selectionStyle = .None
se desea. Si no desea o no desea que se llame a esa función delegada (es decir, tener un campo de texto en una tabla ViewCell),tableView.allowsSelection = false
está bien.Todo lo que tiene que hacer es establecer el estilo de selección en la
UITableViewCell
instancia usando:C objetivo:
o
Swift 2:
Swift 3 y 4.x:
Además, asegúrese de no implementar
-tableView:didSelectRowAtIndexPath:
en su delegado de vista de tabla o excluir explícitamente las celdas en las que no desea realizar ninguna acción si lo implementa.Más información aquí y aquí
fuente
Como 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 la lógica y / o resultado deseado:
1.Para desactivar el resaltado azul sin cambiar ninguna otra interacción de la celda:
Lo uso cuando tengo un UIButton - o algún otro control (es) - alojado en una UITableViewCell y quiero que el usuario pueda interactuar con los controles pero no con la celda en sí.
NOTA : Como señaló Tony Million anteriormente, esto NO impide
tableView:didSelectRowAtIndexPath:
. Me salgo de esto con simples declaraciones "if", que a menudo prueban la sección y evitan acciones para una sección en particular.Otra forma en la que pensé para probar el golpeteo de una celda como esta es:
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:
En mis pruebas, esto todavía permite que los controles dentro de la
UITableViewCell
sean interactivos.3.Para hacer que una celda sea de "solo lectura", simplemente puede hacer esto:
4. Para hacer una tabla completa "solo lectura"
5.Para determinar sobre la marcha si resaltar una celda (que según esta respuesta incluye implícitamente la selección), puede implementar el siguiente
UITableViewDelegate
método de protocolo:fuente
tableView:shouldHighlightRowAtIndexPath:
, que generalmente (no siempre) es mi enfoque preferido.Para resumir, creo que son las respuestas correctas basadas en mi propia experiencia en la implementación de esto:
Si desea deshabilitar la selección de solo algunas de las celdas, use:
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 en los que se debe hacer clic, debe:
y también debe ignorar cualquier clic en la celda
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
.Si desea deshabilitar la selección para toda la tabla, use:
(¡Gracias a Paulo De Barros, gracias!)
fuente
A partir de iOS 6.0,
UITableViewDelegate
tienetableView:shouldHighlightRowAtIndexPath:
. (Lea sobre esto en la documentación de iOS ).Este método le permite marcar filas específicas como no resaltables (e implícitamente, no seleccionables) sin tener que cambiar el estilo de selección de una celda, interfiriendo con el manejo de eventos de la celda
userInteractionEnabled = NO
o con cualquier otra técnica documentada aquí.fuente
También puede deshabilitar la selección de fila desde el propio generador de interfaces seleccionando
NoSelection
laselection
opción (de Propiedades de UITableView) en el panel del inspector como se muestra en la imagen a continuaciónfuente
SOLUCIÓN FIJA PARA SWIFT 3
fuente
En su
UITableViewCell
's XI ter en el atributo valor establecido inspector deSelection
aNone
.fuente
Si desea que la selección solo parpadee, no permanezca en el estado seleccionado, puede llamar, en
el seguimiento
entonces parpadeará el estado seleccionado y revertirá.
fuente
En caso de que alguien necesite una respuesta para Swift :
fuente
Esto es lo que uso, en
cellForRowAtIndexPath
escribir este código .:fuente
Desde el
UITableViewDelegate
Protocolo puede usar el métodowillSelectRowAtIndexPath
yreturn nil
si no desea que se seleccione la fila.De la misma manera, puede usar el
willDeselectRowAtIndexPath
método yreturn nil
si no desea que la fila anule la selección.fuente
1- Todo lo que tienes que hacer es establecer el estilo de selección en la
UITableViewCell
instancia usando:C objetivo:
o
Swift 2:
Swift 3:
2 - No implementar -
tableView:didSelectRowAtIndexPath:
en su vista de tabladelegate
o excluya explícitamente las celdas que no desea que se realicen si lo implementa.3 - Además, también puedes hacerlo desde el guión gráfico. Haga clic en la celda de vista de tabla y en el inspector de atributos en Celda de vista de tabla, cambie el menú desplegable junto a Selección a Ninguno.
4 - Puede deshabilitar el resaltado de la celda de la tabla usando el código siguiente en (iOS) Xcode 9, Swift 4.0
fuente
C objetivo:
Debajo del fragmento, deshabilite el resaltado, pero también deshabilita la llamada a
didSelectRowAtIndexPath
. Entonces, si no está implementandodidSelectRowAtIndexPath
, use el siguiente método. Esto debe agregarse cuando está creando la tabla. SinUITextField
embargo, esto funcionará en los botones y dentro de la celda.A continuación, el fragmento deshabilita el resaltado y no deshabilita la llamada a
didSelectRowAtIndexPath
. Establezca el estilo de selección de celda en Ninguno encellForRowAtIndexPath
Debajo del fragmento, deshabilite todo en la celda. Esto desactivará la interacción a
buttons
,textfields
:Rápido:
A continuación se encuentran el
Swift
equivalente de lasObjective-C
soluciones anteriores :Reemplazo de la primera solución
Reemplazo de la segunda solución
Reemplazo de la tercera solución
fuente
Intenta escribir:
Deseleccionará su fila cuando sea necesario.
En Swift3 ...
fuente
He estado luchando con esto muy profusamente, teniendo un control en mi
UITableViewCell
prohibido el uso de lauserInteractionEnabled
propiedad. Tengo una tabla estática de 3 celdas para la configuración, 2 con fechas, 1 con un interruptor de encendido / apagado. Después de jugar en Storyboard / IB, pude hacer que el inferior no sea seleccionable, pero cuando lo tocas, la selección de una de las filas superiores desaparece. Aquí hay una imagen WIP de mi configuración UITableView:Si toca la tercera fila, no pasa nada, la selección permanecerá en la segunda fila. La funcionalidad es prácticamente una copia de la pantalla de selección de hora de agregar evento de la aplicación Calendario de Apple.
El código es sorprendentemente compatible, hasta IOS2 = /:
Esto funciona junto con la configuración del estilo de selección en none, por lo que la celda no parpadea en eventos de touchdown
fuente
Podemos escribir código como
pero cuando tenemos xib celda personalizado por encima de la línea de advertencia dar en ese momento para
xib celular personalizado
necesitamos establecer el estilo de selección Ninguno desde el generador de interfaces
fuente
Solo tiene que poner este código en cellForRowAtIndexPath
Para deshabilitar la propiedad de selección de la celda: (Mientras toca la celda).
fuente
prueba esto
y
y también puede establecer el estilo de selección usando el creador de interfaces.
fuente
Estoy usando esto, que funciona para mí.
fuente
Si bien esta es la mejor y más fácil solución para evitar que una fila muestre el resaltado durante la selección
También me gustaría sugerir que ocasionalmente es útil mostrar brevemente que la fila ha sido seleccionada y luego desactivarla. Esto alerta a los usuarios con una confirmación de lo que pretendían seleccionar:
fuente
Deshabilite directamente el resaltado de TableViewCell en el guión gráfico
fuente
Para deshabilitar el resaltado de UItableviewcell
Y no debe permitir que el usuario interactúe con la célula.
fuente
También puede establecer el color de fondo en Borrar para lograr el mismo efecto que
UITableViewCellSelectionStyleNone
, en caso de que no quiera / no pueda usarUITableViewCellSelectionStyleNone
.Usaría un código como el siguiente:
Esto puede degradar su rendimiento al agregar una vista de color adicional a cada celda.
fuente
Puedes usar :
en la celda para la fila en el método de ruta de índice de su UITableView.
También puedes usar:
en la vista de tabla didselectrowatindexpath método.
fuente
cell.selectionStyle = UITableViewCellSelectionStyle.none
en Swift 3.Puedes usar esto
fuente
Puedes usar ....
fuente
fuente
Feliz codificación !!!
fuente
También puedes hacerlo desde el guión gráfico. Haga clic en la celda de vista de tabla y en el inspector de atributos en Celda de vista de tabla, cambie el menú desplegable junto a Selección a Ninguno.
fuente