Estoy mostrando en un grupo tableview
contenidos analizados desde XML. Quiero deshabilitar el evento de clic en él (no debería poder hacer clic en absoluto) La tabla contiene dos grupos. Quiero deshabilitar 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 tubo player view
.
¿Cómo puedo hacer que solo grupos o filas específicos sean seleccionables?
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section!=0)
if(indexPath.row==0)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:tubeUrl]];
}
Gracias.
fuente
tableView:shouldHighlightRowAtIndexPath:
es un nuevoUITableViewDelegate
método que devuelve enBOOL
función de si seindexPath
debe resaltar o no lo aprobado . Si está compilando para 6.0 y versiones posteriores, le recomiendo esta nueva API.cell!.selectionStyle = .None
qué fuerza desenvuelve la celda, lo que le permite acceder a sus propiedades.Si desea que una fila (o subconjunto de filas) no sea seleccionable , implemente el
UITableViewDelegate
método-tableView:willSelectRowAtIndexPath:
(también mencionado por TechZen). SiindexPath
no se puede seleccionar , devuelvanil
, de lo contrario devuelva elindexPath
. Para obtener el comportamiento de selección predeterminado, simplemente devuelve loindexPath
pasado a sudelegate
método, pero también puede alterar la selección de fila devolviendo un valor diferenteindexPath
.ejemplo:
fuente
A partir de iOS 6, puedes usar
Si regresa
NO
, deshabilita el resaltado de selección y los segmentos activados por el guión gráfico conectados a esa celda.Se llama al método cuando se toca un toque en una fila. Volver
NO
a ese mensaje detiene el proceso de selección y no hace que la fila seleccionada actualmente pierda su aspecto seleccionado mientras el toque está presionado.Referencia del protocolo UITableViewDelegate
fuente
Ninguna de las respuestas anteriores realmente aborda el problema correctamente. La razón es que queremos deshabilitar la selección de la celda, pero no necesariamente las subvistas dentro de la celda.
En mi caso, estaba presentando un interruptor UIS en el medio de la fila y quería deshabilitar la selección para el resto de la fila (que está vacía) ¡pero no para el interruptor! La forma correcta de hacerlo es, por lo tanto, en el método
donde una declaración de la forma
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 cierto si alguien deshabilita la interacción del usuario a través de
Método que simplemente prepara la célula y no permite la interacción con el UISwitch.
Además, usando el método
para anular la selección de la celda con una declaración del formulario
todavía muestra la fila que se está seleccionando mientras el usuario presiona la vista de contenido original de la celda.
Solo mis dos centavos. Estoy bastante seguro de que muchos encontrarán esto útil.
fuente
willSelectRowAtIndexPath
tiene el mismo problema, las subvistas no son seleccionables.Atrapa las selecciones con estos métodos de origen de datos.
En estos métodos, verifica si la fila seleccionada es la que desea que se pueda seleccionar. Si es así, tome una acción, si no, no haga nada.
Desafortunadamente, no puede desactivar la selección para una sola sección. Es toda la mesa o nada.
Sin embargo, puede establecer las celdas de la tabla
selectionStyle
propiedad de enUITableViewCellSelectionStyleNone
. Creo que eso hará invisible la selección. Combinado con los métodos anteriores que deberían hacer que las células se vean completamente inertes desde la perspectiva del usuario.Edit01:
Si tiene una tabla en la que solo algunas de las filas son seleccionables, es importante que las celdas de las filas seleccionables sean visualmente distintas de las filas no seleccionables. El botón accesorio chevron es la forma predeterminada de hacer esto.
Independientemente de cómo lo haga, no quiere que sus usuarios intenten seleccionar filas y piensen que la aplicación ha fallado porque la fila no hace nada.
fuente
Help -> Developer documentation
, luego copie los nombres de los métodos en el campo de búsqueda para ver cómo funciona. La documentación del desarrollador también contiene código de muestra.Para Swift 4.0 por ejemplo:
fuente
Debe hacer algo como lo siguiente para deshabilitar la selección de celdas dentro del
cellForRowAtIndexPath
método:Para mostrar la celda en gris, coloque lo siguiente dentro del
tableView:WillDisplayCell:forRowAtIndexPath
método:Un método le permite controlar la interactividad, el otro le permite controlar la apariencia de la interfaz de usuario.
fuente
Para detener solo algunas celdas seleccionadas, use:
Además de evitar la selección, esto también detiene tableView: didSelectRowAtIndexPath: se llama para las celdas que lo tienen configurado.
fuente
userInteractionEnabled
NO en una celda (más claramente, un indexPath), la interacción del usuario de algunas OTRAS celdas se desactiva. No tengo idea de por qué sucede esto cada vez que lo usouserInteractionEnabled
en las celdas de la vista de tabla. ¿Es un error conocido o hice algo mal?if [indexPath row] == 0
)NO
entableView:cellForRowAtIndexPath:
después de quitar la celda. Por lo general, funciona bien al principio. Luego, después de varias llamadas dereloadData
, de repente, la quinta fila no permite la interacción, luego la cuarta fila ... No puedo entender cuándo sucederá. Todo parece aleatorio.if [indexPath row] == 0) { set to NO } else { set to YES }
Puede usar el
tableView:willDisplayCell
método para hacer todos los tipos de personalización de una tableViewCell.En este código anterior, el usuario solo puede seleccionar la primera fila en la segunda sección de tableView. El resto no se pueden seleccionar todas las filas. Gracias ~
fuente
Para rápido:
fuente
Mi solución basada en el modelo de datos:
fuente
Para swift 4.0 Esto hará el truco. Deshabilitará la celda en el método didSelectRowAtIndexPath pero mantendrá las subvistas haciendo clic.
fuente
return indexPath.row == clickableIndex ? indexPath : nil
mantiene su código un poco más limpio ;-)Use esto para hacer que la celda parezca deshabilitada y no seleccionable:
Importante: tenga en cuenta que esta es solo una propiedad de estilo y que en realidad no deshabilita la celda. Para hacer eso, debe verificar
selectionStyle
en ladidSelectRowAtIndexPath:
implementación de su delegado:fuente
Me gusta la respuesta de Brian Chapados arriba. Sin embargo, esto significa que puede tener una lógica duplicada en cellForRowAtIndexPath y luego en willSelectRowAtIndexPath, que puede desincronizarse fácilmente. En lugar de duplicar la lógica, simplemente verifique el selectionStyle:
fuente
Me pareció útil ya que funciona con tablas estáticas y dinámicas. Solo configuro el indicador de divulgación en aquellas celdas que deseo permitir la selección.
fuente
en Xcode 7 sin codificar, simplemente puede hacer lo siguiente:
En la vista de esquema, seleccione Vista de tabla Celda. (La celda está anidada en Escena del controlador de vista de tabla> Controlador de vista de tabla> Vista de tabla. Puede que tenga que revelar esos objetos para ver la celda de 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.
fuente
SENCILLO
Solo use
cell.userInteractionEnabled = YES;
la celda si puede navegar y de locell.userInteractionEnabled = NO;
contrariofuente
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 hace, regrese nulo.Ejemplo de mi aplicación:
Lo bueno de esto es que
shouldPerformSegueWithIdentifier:sender:
no se llamará si el método anterior devuelve nulo, aunque repito la prueba anterior solo para completar.fuente
Para Xcode 6.3:
fuente
Estoy de acuerdo con la respuesta de Bryan
si lo hago
entonces las subvistas dentro de la celda no serán interactuadas por el usuario.
En el otro sitio, configuración
activará el método didSelect a pesar de no actualizar el color de selección.
Usar willSelectRowAt es la forma en que resolví mi problema. Ejemplo:
fuente
además de
tableView.allowsMultipleSelection = true
que tendrá que anular la selección del resto de las celdas de la sección al seleccionar:fuente
para swift 3.0 puede usar el siguiente código para deshabilitar la interacción del usuario con la celda UITableView
fuente