UITableview: Cómo deshabilitar la selección para algunas filas pero no otras

Estoy mostrando en un contenido de tableview grupo analizado desde XML. Deseo desactivar el evento click en él (no debería poder hacer clic en él) La tabla contiene dos grupos. Deseo desactivar la selección solo para el primer grupo pero no para el segundo grupo. Al hacer clic en la primera fila del segundo grupo, navigates a mi player view tubo.

¿Cómo puedo seleccionar solo grupos o filas específicos?

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if(indexPath.section!=0) if(indexPath.row==0) [[UIApplication sharedApplication] openURL:[NSURL URLWithString:tubeUrl]]; } 

Gracias.

Solo tienes que poner este código en cellForRowAtIndexPath

Para deshabilitar la propiedad de selección de la celda: (al tocar la celda)

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

Para habilitar la posibilidad de seleccionar (tocar) la celda: (tocando la celda)

 // Default style cell.selectionStyle = UITableViewCellSelectionStyleBlue; // Gray style cell.selectionStyle = UITableViewCellSelectionStyleGray; 

Tenga en cuenta que una celda con selectionStyle = UITableViewCellSelectionStyleNone; aún causará que la IU llame a didSelectRowAtIndexPath cuando lo toque el usuario. Para evitar esto, haga lo que se sugiere a continuación y configúrelo.

 cell.userInteractionEnabled = NO; 

en lugar. También tenga en cuenta que es posible que desee establecer cell.textLabel.enabled = NO; para oscurecer el artículo.

Si desea hacer que una fila (o un subconjunto de filas) no sea seleccionable , implemente el método -tableView:willSelectRowAtIndexPath: (también mencionado por TechZen). Si el indexPath no debe ser seleccionable , devuelva nil ; de lo contrario, devuelva indexPath . Para obtener el comportamiento de selección predeterminado, simplemente devuelve el indexPath pasado a su método delegate , pero también puede modificar la selección de fila devolviendo un indexPath diferente.

ejemplo:

 - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { // rows in section 0 should not be selectable if ( indexPath.section == 0 ) return nil; // first 3 rows in any section should not be selectable if ( indexPath.row <= 2 ) return nil; // By default, allow row to be selected return indexPath; } 

Comenzando en iOS 6, puedes usar

 -tableView:shouldHighLightRowAtIndexPath: 

Si devuelve NO , deshabilita tanto el resaltado de selección como los guiones desencadenados del guión gráfico conectados a esa celda.

El método se invoca cuando se toca un toque en una fila. Devolver NO a ese mensaje detiene el proceso de selección y no hace que la fila seleccionada actualmente pierda su aspecto seleccionado mientras la tecla táctil está presionada.

Referencia del protocolo UITableViewDelegate

Ninguna de las respuestas anteriores realmente aborda el problema correctamente. La razón es que queremos desactivar la selección de la celda, pero no necesariamente de las subvistas dentro de la celda.

En mi caso, estaba presentando un UISwitch en el medio de la fila y quería desactivar la selección para el rest de la fila (que está vacía) pero no para el cambio. La forma correcta de hacerlo es por lo tanto en el método

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

donde una statement de la forma

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

deshabilita la selección para la celda específica y al mismo tiempo permite al usuario manipular el interruptor y, por lo tanto, usar el selector apropiado. Esto no es así si alguien inhabilita la interacción del usuario a través del

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

método que simplemente prepara la célula y no permite la interacción con el UISwitch.

Además, usando el método

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

para anular la selección de la celda con una statement de la forma

 [tableView deselectRowAtIndexPath:indexPath animated:NO]; 

todavía muestra la fila que se está seleccionando mientras el usuario presiona sobre la vista de contenido original de la celda.

Solo mis dos centavos. Estoy bastante seguro de que muchos encontrarán esto útil.

Usted atrapa las selecciones con estos métodos de fuente de datos.

 – tableView:willSelectRowAtIndexPath: – tableView:didSelectRowAtIndexPath: – tableView:willDeselectRowAtIndexPath: – tableView:didDeselectRowAtIndexPath: 

En estos métodos, verifica si la fila seleccionada es la que desea que se pueda seleccionar. Si es así, realiza una acción, si no, no hagas nada.

Desafortunadamente, no puede desactivar la selección para solo una sección. Es toda la mesa o nada.

Sin embargo, puede establecer la propiedad selectionStyle celdas de la tabla en UITableViewCellSelectionStyleNone . Creo que eso hará que la selección sea invisible. Combinado con los métodos anteriores que deberían hacer que las celdas parezcan completamente inertes desde la perspectiva del usuario.

Edit01:

Si tiene una tabla en la que solo se pueden seleccionar algunas de las filas, es importante que las celdas de las filas seleccionables sean visualmente distintas de las filas no seleccionables. El botón de accesorio de chevron es la forma predeterminada de hacerlo.

Independientemente de cómo lo haga, no quiere que sus usuarios intenten seleccionar filas y piensen que la aplicación se ha estropeado porque la fila no hace nada.

cellForRowAtIndexPath hacer algo como lo siguiente para deshabilitar la selección de celdas dentro del método cellForRowAtIndexPath :

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; [cell setUserInteractionEnabled:NO]; 

Para mostrar la celda en gris, coloque lo siguiente dentro del tableView:WillDisplayCell:forRowAtIndexPath :

 [cell setAlpha:0.5]; 

Un método le permite controlar la interactividad, el otro le permite controlar la apariencia de la interfaz de usuario.

Para Swift 4.0, por ejemplo:

 cell.isUserInteractionEnabled = false cell.contentView.alpha = 0.5 

Para detener solo algunas celdas seleccionadas, 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.

Puede usar el método tableView:willDisplayCell para hacer todos los tipos de personalización de un tableViewCell.

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; [cell setUserInteractionEnabled:NO]; if (indexPath.section == 1 && indexPath.row == 0) { [cell setSelectionStyle:UITableViewCellSelectionStyleGray]; [cell setUserInteractionEnabled:YES]; } } 

En este código anterior, el usuario solo puede seleccionar la primera fila en la segunda sección de tableView. El rest no se pueden seleccionar todas las filas. ¡Gracias! ~

Mi solución basada en el modelo de datos:

 func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { let rowDetails = viewModel.rowDetails(forIndexPath: indexPath) return rowDetails.enabled ? indexPath : nil } func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool { let rowDetails = viewModel.rowDetails(forIndexPath: indexPath) return rowDetails.enabled } 

Para rápido:

 cell.selectionStyle = .None cell.userInteractionEnabled = false 

Use esto para hacer que la celda se vea como deshabilitada y no seleccionable:

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

Importante: tenga en cuenta que esto es solo una propiedad de estilo, y en realidad no deshabilita la celda. Para hacerlo, debe verificar la selectionStyle de didSelectRowAtIndexPath: en su didSelectRowAtIndexPath: delegar la implementación:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; if(cell.selectionStyle == UITableViewCellSelectionStyleNone) { return; } // do your cell selection handling here } 

SENCILLO

Simplemente use cell.userInteractionEnabled = YES; a la celda si puede navegar y cell.userInteractionEnabled = NO; de otra manera

Me gusta la respuesta de Brian Chapados arriba. Sin embargo, esto significa que puede tener duplicada la lógica tanto en cellForRowAtIndexPath como en willSelectRowAtIndexPath, que puede perderse fácilmente de sincronización. En lugar de duplicar la lógica, simplemente verifique el estilo de selección:

 - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; if (cell.selectionStyle == UITableViewCellSelectionStyleNone) return nil; else return indexPath; } 

Encontré esto útil, ya que funciona con tablas estáticas y dinámicas. Solo configuro el indicador de divulgación en las celdas que quiero permitir la selección.

 - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) { return nil; } return indexPath; } 

en Xcode 7 sin encoding, simplemente puede hacer lo siguiente:

En la vista de esquema, seleccione Celda de vista de tabla. (La celda está anidada en Table View Controller Scene> Table View Controller> Table View. Puede que tenga que revelar esos objetos para ver la celda de la vista de tabla)

En el inspector de atributos, busque el campo etiquetado Selección y seleccione Ninguno. inspector de atributos Con esta opción, la celda no obtendrá un resaltado visual cuando un usuario la toque.

Implemente solo el método tableView:willSelectRowAtIndexPath: en la fuente de datos para su tabla. Si desea resaltar la fila en la ruta, devuelva el indexPath dado. Si no lo haces, devuelve nil.

Ejemplo de mi aplicación:

 - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { MySelectableObj* obj = [self objectAtPath:indexPath]; if(obj==nil) return nil; return indexPath; } 

Lo bueno de esto es que shouldPerformSegueWithIdentifier:sender: no se shouldPerformSegueWithIdentifier:sender: si el método anterior devuelve nil, aunque repito la prueba anterior solo para completar.

Para Xcode 6.3:

  cell.selectionStyle = UITableViewCellSelectionStyle.None; 

para swift 3.0 puede usar el siguiente código para deshabilitar la interacción del usuario con la celda UITableView

  cell.isUserInteractionEnabled = false