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?
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?
Respuestas:
Para mí, lo siguiente funcionó bien:
tableView.allowsSelection = false
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" usando didSelectRowAt#
.)
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:
tableView.allowsSelectionDuringEditing = false
selectionStyle
propiedad en la celda: cell.selectionStyle = UITableViewCellSelectionStyle.None
en Swift o cell.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:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
o
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 y 4.x:
cell.selectionStyle = .none
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.
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:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
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 impidetableView: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:
- (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
}
}
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 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:
[cell setUserInteractionEnabled:NO];
4. Para hacer una tabla completa "solo lectura"
[tableView setUserInteractionEnabled:NO];
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:
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
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:
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 en los que se debe hacer clic, debe:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
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:
tableView.allowsSelection = NO;
(¡Gracias a Paulo De Barros, gracias!)
A partir de iOS 6.0, UITableViewDelegate
tiene tableView: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í.
También puede deshabilitar la selección de fila desde el propio generador de interfaces seleccionando NoSelection
la selection
opción (de Propiedades de UITableView) en el panel del inspector como se muestra en la imagen a continuación
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];
entonces parpadeará el estado seleccionado y revertirá.
Esto es lo que uso, en cellForRowAtIndexPath
escribir este código .:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Desde el UITableViewDelegate
Protocolo puede usar el método willSelectRowAtIndexPath
y return nil
si no desea que se seleccione la fila.
De la misma manera, puede usar el willDeselectRowAtIndexPath
método y return nil
si no desea que la fila anule la selección.
1- Todo lo que tienes que hacer es establecer el estilo de selección en laUITableViewCell
instancia usando:
C objetivo:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
o
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3:
cell.selectionStyle = .none
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
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
cell.selectionStyle = .none
return cell
}
Debajo del fragmento, deshabilite el resaltado, pero también deshabilita la llamada a didSelectRowAtIndexPath
. Entonces, si no está implementando didSelectRowAtIndexPath
, use el siguiente método. Esto debe agregarse cuando está creando la tabla. Sin UITextField
embargo, esto funcionará en los botones y dentro de la celda.
self.tableView.allowsSelection = NO;
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
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Debajo del fragmento, deshabilite todo en la celda. Esto desactivará la interacción a buttons
, textfields
:
self.tableView.userInteractionEnabled = false;
A continuación se encuentran el Swift
equivalente de las Objective-C
soluciones anteriores :
Reemplazo de la primera solución
self.tableView.allowsSelection = false
Reemplazo de la segunda solución
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Reemplazo de la tercera solución
self.tableView.userInteractionEnabled = false
Intenta escribir:
cell.selected = NO;
Deseleccionará 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, teniendo un control en mi UITableViewCell
prohibido el uso de la userInteractionEnabled
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 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
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
Podemos escribir código como
cell.selectionStyle = UITableViewCellSelectionStyleNone;
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
Solo tiene que poner este código en cellForRowAtIndexPath
Para deshabilitar la propiedad de selección de la celda: (Mientras toca la celda).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Estoy usando esto, que funciona para mí.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
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
cell.selectionStyle = UITableViewCellSelectionStyleNone;
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:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
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 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 rendimiento al agregar una vista de color adicional a cada celda.
Puedes usar :
cell.selectionStyle = UITableViewCellSelectionStyleNone;
en la celda para la fila en el método de ruta de índice de su UITableView.
También puedes usar:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
en la vista de tabla didselectrowatindexpath método.
cell.selectionStyle = UITableViewCellSelectionStyle.none
en Swift 3.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Feliz codificación !!!
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