2010-08-30 20 views
35

¿Cómo se desactiva la selección de solo una celda en una UITableView? Tengo varios, y solo quiero que el último esté deshabilitado.Deshabilitar la selección de una sola UITableViewCell

+0

posible duplicado de [UITableview: Cómo desactivar la selección para algunas filas pero no otras] (http://stackoverflow.com/questions/2267993/uitableview-how-to-disable-selection-for-some-rows-but -no-otros) – JosephH

Respuesta

51
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = ... 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

} 
+32

Esto evitará que la celda parezca seleccionada, pero 'tableView: didSelectRowAtIndexPath:' seguirá siendo invocada. – Brian

+2

Vea mi respuesta para una solución limpia que realmente funciona. – Barry

+0

Usar tanto 'cell.selectionStyle = .None' como' cell.userInteractionEnabled = false' combinado cubrirá la mayoría de los escenarios. – SwiftArchitect

10
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ([self numberOfRowsInSection] == [indexPath row]) { 
     return nil; 
    } else { 
     return indexPath; 
    } 
} 

la última fila de la tabla no se seleccionarán

+1

Esto evitará que realmente se seleccione la celda, pero aún se resaltará cuando el usuario la toque – Brian

+2

Lo siento, necesito agregar el estilo UITableViewCellSelectionStyleNone a la celda –

+1

Podría agregar que configurar el estilo de selección de tabla vista debe hacerse en cellForRowAtIndexPath: to evite el retraso al cargar TableView (la vista de tabla tarda 1-2 en deshabilitar la selección para la celda). –

50

Para detener el uso sólo algunas células siendo seleccionados:

cell.userInteractionEnabled = NO; 

Así como la prevención de la selección, esto también se detiene tableView : didSelectRowAtIndexPath: se llama para las celdas que lo tienen configurado. También hará que la voz en off la trate igual que un botón atenuado (que puede o no ser lo que desea).

Tenga en cuenta que si tiene elementos interactivos en la celda (es decir, conmutadores/botones), necesitará usar cell.selectionStyle = UITableViewCellSelectionStyleNone; en su lugar y luego asegúrese de ignorar los toques en la celda en tableView:didSelectRowAtIndexPath:.

+0

Intente hacer esto en la vista que recibe el resaltado. De lo contrario, es lo mismo que deshabilitar la celda. –

+4

No puedo usar esto porque también deshabilita 'cell.accessoryView', que he configurado como' UIButton' que quiero que se pueda tocar. – ma11hew28

+0

Además, esto hará que Voice Over trate incorrectamente la celda como un botón atenuado en lugar de texto estático (con un accesorio opcional). – Endersstocker

2

Como mencioné in another thread todos los métodos anteriores no resuelven el problema con precisión. La forma correcta de desactivación de una célula es por medio del método

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

y en que el método uno tiene que usar

[cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

que desactiva la selección celular, pero todavía permite al usuario interactuar con subvistas de la celular como un UISwitch.

18

tirar esto en su aduana Tabla VC:

// cells lacking UITableViewCellAccessoryDisclosureIndicator will not be selectable 
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 
    if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) { 
     return nil; 
    } 
    return indexPath; 
} 

// disabled cells will still have userinteraction enabled for their subviews 
- (void)setEnabled:(BOOL)enabled forTableViewCell:(UITableViewCell *)tableViewCell 
{ 
    tableViewCell.accessoryType = (enabled) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone; 
    // if you dont want the blue selection on tap, comment out the following line 
    tableViewCell.selectionStyle = (enabled) ? UITableViewCellSelectionStyleBlue : UITableViewCellSelectionStyleNone; 
} 

A continuación, para permitir la selección/desactivar para someTableViewCell, hacer esto:

[self setEnabled:state forTableViewCell:someTableViewCell]; 

Ha terminado y puede enviar.

+0

¡Gracias, esto funciona como un encanto! – Harry

1

La solución más limpia que he encontrado para esto solo hace uso del método de delegado willDisplayCell.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if([indexPath row] == 0) //<-----ignores touches on first cell in the UITableView 
    {      //simply change this around to suit your needs 
     cell.userInteractionEnabled = NO; 
     cell.textLabel.enabled = NO; 
     cell.detailTextLabel.enabled = NO; 
    } 
} 

Usted no tiene que tomar ninguna otra medida en el didSelectRowAtIndexPath método delegado para asegurar que la selección de esta célula se ignora. Se ignorarán todos los toques en esta celda y el texto en la celda también se atenuará.

0

con iOS 6.

Se puede utilizar el siguiente método delegado y regresar NO en caso de que no se a ser seleccionado y YES en caso de que quiera que sea seleccionado.

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return indexPath.section == 0; 
} 
0

probar este en Swift:

self.tableView.deselectRowAtIndexPath(indexPath, animated: true) 
0

Si alguien se pregunta cómo lograr esto en veloz entonces aquí es mi código. Estoy usando Xcode 7 y probado usando iPad Retina (iOS 9).

cell.selectionStyle = UITableViewCellSelectionStyle .None 
cell.userInteractionEnabled = false 

Intente colocar este código de dos líneas si lo desea. En mi caso, he usado esto en este método para mostrar celdas.

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 

Recuerde esta línea de código de dos bloqueará cualquier tipo de selección o la interacción de sus células, pero sólo se puede utilizar la primera línea de forma individual si lo desea. Es decir ...

cell.selectionStyle = UITableViewCellSelectionStyle .None 

Solo esta línea bloqueará la selección de sus celdas.

Sin embargo, la segunda línea hará que la celda sea "Solo lectura". Es decir ..

cell.userInteractionEnabled = false 

Gracias

Espero que esto ayudó.

Cuestiones relacionadas