ios - uitableviewcontroller - ¿Cómo puedo deshabilitar la selección de UITableView?
uitableviewcontroller swift 4 (20)
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?
C objetivo:
Debajo del fragmento, deshabilitar el resaltado, pero también deshabilita la llamada a
didSelectRowAtIndexPath
. Entonces, si no está implementandodidSelectRowAtIndexPath
, use el método a continuación. Esto debe agregarse cuando está creando la tabla. Esto funcionará en botones yUITextField
dentro de la celda sin embargo.self.tableView.allowsSelection = NO;
Debajo del fragmento, deshabilite el resaltado y no desactiva la llamada a
didSelectRowAtIndexPath
. Establezca el estilo de selección de celda en Ninguno encellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Debajo del fragmento de código deshabilita todo en la celda. Esto deshabilitará la interacción de
buttons
,textfields
:self.tableView.userInteractionEnabled = false;
Rápido:
A continuación se muestran los equivalentes Swift
de las soluciones anteriores de Objective-C
:
Reemplazo de Primera Solución
self.tableView.allowsSelection = false
Reemplazo de Segunda Solución
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Reemplazo de Tercera Solución
self.tableView.userInteractionEnabled = false
A partir de iOS 6.0, UITableViewDelegate
tiene tableView:shouldHighlightRowAtIndexPath:
(Lea sobre esto en la Documentation iOS.)
Este método le permite marcar filas específicas como poco elevables (e implícitamente, no seleccionables) sin tener que cambiar el estilo de selección de una celda, userInteractionEnabled = NO
manejo de eventos de la celda con userInteractionEnabled = NO
, o cualquier otra técnica documentada aquí.
Desde el Protocolo UITableViewDelegate
, puede usar el método willSelectRowAtIndexPath
y return nil
si no desea que se seleccione la fila.
De la misma manera, puede usar el método willDeselectRowAtIndexPath
y return nil
si no desea que la fila se deseleccione.
En caso de que alguien necesite respuesta para Swift :
cell.selectionStyle = .None
Esto es lo que uso:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
en cellForRowAtIndexPath escribe este código.
Estoy usando esto, que funciona para mí.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Para deshabilitar el resaltado de la UItableviewcell
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Y no debe permitir que el usuario interactúe con la célula.
cell.userInteractionEnabled = NO;
Para mí, lo siguiente funcionó bien:
tableView.allowsSelection = NO;
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
o cualquier otro control, por supuesto, esos controles aún funcionarán. 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#
.)
Podemos escribir código como
cell.selectionStyle = UITableViewCellSelectionStyleNone;
pero cuando tengamos una celda personalizada por encima de la línea xib damos una advertencia en ese momento para
xib celular personalizado
Necesitamos establecer el estilo de selección Ninguno desde el generador de interfaces.
Puedes usar ....
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Puedes usar la propiedad selectionStyle de UITableViewCell
cell.selectionStyle = UITableViewCellSelectionStyleNone;
O
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Además, no implementar a continuación delegado
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }
Si ha creado un archivo Xib / Storyboard, puede cambiar la propiedad setUserInteractionEnabled de tableview a No al desmarcarla. Esto hará que tu tableview sea de solo lectura.
Si bien esta es la mejor y más fácil solución para evitar que una fila muestre lo más destacado durante la selección
cell.selectionStyle = UITableViewCellSelectionStyleNone;
También me gustaría sugerir que en ocasiones 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 intentaron seleccionar:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Solo tienes 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
También he estado luchando con esto bastante profusamente, 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 fechas, 1 con un interruptor de encendido / apagado. Después de jugar en Storyboard / IB, he logrado que el de abajo 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 tiempo de evento añadido 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 ninguno, por lo que la celda no parpadea en los eventos de toma de contacto
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.
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 debajo de Célula de vista de tabla, cambie el menú desplegable junto a Selección a Ninguno.
para una rápida deselección
cell.selectionStyle = .None
prueba esto
cell.selectionStyle = UITableViewCellSelectionStyleNone;
y
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
y también puede establecer el estilo de selección utilizando interfacebuilder.
Solución rápida con celda personalizada:
import Foundation
class CustomTableViewCell: UITableViewCell
{
required 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
}
}
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Feliz codificacion !!!