iphone - tutorial - ios
UITableView Establecer algunas celdas como "no seleccionables" (15)
¿Cómo puedo configurar la propiedad de la célula de UITableView para que no se pueda seleccionar? No quiero ver ese cuadro de selección azul cuando el usuario toca la celda.
Para evitar la selección de filas
Para evitar completamente la selección de UITableViewCell
, UITableViewCell
que UITableViewDelegate
implemente tableView:willSelectRowAtIndexPath:
Desde ese método puede devolver nil
si no desea que se seleccione la fila.
- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path
{
// Determine if row is selectable based on the NSIndexPath.
if (rowIsSelectable) {
return path;
}
return nil;
}
Esto evita que la fila sea seleccionada y tableView:didSelectRowAtIndexPath:
desde que se llama. Tenga en cuenta, sin embargo, que esto no impide que la fila se destaque.
Para evitar el resaltado de filas
Si desea evitar que la fila se resalte visualmente al tocar, puede asegurarse de que el estilo de selectionStyle
la celda esté configurado en UITableViewCellSelectionStyleNone
, o preferiblemente puede tener su UITableViewDelegate
implementar tableView:shouldHighlightRowAtIndexPath:
siguiente manera:
- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
// Determine if row is selectable based on the NSIndexPath.
return rowIsSelectable;
}
Apple dice que lo primero que debes hacer en didSelectRowAtIndexPath es deseleccionar la fila
[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
Luego puede cambiar AccessoryType para que sea una marca de verificación, o ninguna, etc. Por lo tanto, cuando ingrese didSelectRowAtIndexPath podría anular la selección de la fila, y si no se debe seleccionar, simplemente no verifique esa fila.
Establecer cell.userinteractionenabled = FALSE;
Establezca la propiedad selectionStyle
la celda de tabla en UITableViewCellSelectionStyleNone
. Eso debería evitar que destaque, y también puede verificar esa propiedad en su tableView:didSelectRowAtIndexPath:
Hay otra manera simple de evitar que la selección aparezca en azul.
Seleccione una celda que no desea que aparezca como azul.
A continuación, seleccione el inspector de atributos (el icono de escudo al lado del icono de regla en la vista de propiedades en el lateral).
Luego cambie el campo ''Selección'' de ''Azul'' a ''Ninguno''.
Tenga en cuenta que, presumiblemente, esto aún se está seleccionando, simplemente no aparecerá como seleccionado si lo único que desea es evitar el efecto UI.
Otra forma es agregar un par de métodos de categoría a UITableViewCell
. Me gusta más esto que la respuesta de Sebastians (también bueno) porque la forma en que estoy construyendo mi mesa. Pensé que podría ser útil para otra persona.
- (void)setSelectable:(BOOL)enabled {
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
[self setUserInteractionEnabled:enabled];
}
- (BOOL)isSelectable {
BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
[self isUserInteractionEnabled];
return ! disabled;
}
Para hacer que cierta fila no sea seleccionada, debe realizar algunos cambios en dos métodos del delegado UITableView.
En el método a continuación
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
después de la asignación de la celda, escriba el código a continuación
if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;
El código anterior evitará resaltar la celda, si de alguna manera el usuario intenta seleccionar.
en este método delegado a continuación
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if(indexPath.row == someCellNumber) return;
//for other cells write the code below...
}
si no escribe if(indexPath.row == someCellNumber) return;
todavía se seleccionará la fila y hay una posibilidad de bloqueo de la aplicación
Si ha diseñado su celda en Interface Builder, puede hacerlo eliminando la casilla de verificación de '' User Interaction Enabled '' para tableViewCell
.
Solo para iOS 6+.
Puede implementar el método tableView:shouldHighlightRowAtIndexPath:
en su delegado. Lea más aquí: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html
Swift 4:
En la clase celular:
selectionStyle = .none
Tenía este problema, también, intenté todo lo que ya se mencionó. El truco final, que eliminó el "flash azul" al seleccionar una celda de tabla, fue agregar esta línea:
self.myTableView.allowsSelection = NO;
No estoy seguro de si fue esta línea o todo combinado, pero como gran resultado total no recibo más selección azul o incluso el flash azul. ¡Contento!
Use tableView: willDisplayCell: forRowAtIndexPath: en lugar de tableView: didSelectRowAtIndexPath: para eliminar el flash que aparece la primera vez que toca la celda.
- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
usar IB es también una manera elegante:
utilizar esta:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Swift 4:
Puede evitar la selección y el resaltado utilizando UITableViewDelegate: shouldHighlightRowAt
Esta respuesta supone que tiene una celda personalizada creada llamada: CustomTableViewCell
Y que creaste un booleano dentro de esa celda personalizada llamada: isSelectable
func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
if cell.isSelectable == false {
return false
} else {
return true
}
}
Esta es la versión Swift de la respuesta objc de Sebastian Celis.