¿Qué haría que una celda de vista de tabla permanezca resaltada después de ser tocada? Hago clic en la celda y puedo ver que permanece resaltada mientras se empuja una vista detallada. Una vez que aparece la vista de detalle, la celda sigue resaltada.
ios
uitableview
cocoa-touch
4thSpace
fuente
fuente
deselectRowAtIndexPath
a mi viewDidAppear, si selecciono la fila aparece una nueva vista.-deselectRowAtIndexPath:animated:
método en su propiedad tableView desde-viewDidAppear
. Sin embargo, si tiene una vista de tabla en una subclase de UIViewController, debe llamar-deselectRowAtIndexPath:animated:
desde-viewDidAppear
usted mismo. :)-viewWillAppear:
eso lo rompió. Agregar una llamada para[super viewWillAppear:animated]
que funcione nuevamente.UITableViewController
'sclearsSelectionOnViewWillAppear
propiedad se establece enYES
(que es el valor por defecto), y no se ha impedido[super viewWillAppear]
de ser llamado.La forma más limpia de hacerlo es a la vista
De esta manera, tiene la animación de desvanecer la selección cuando regrese al controlador, como debería ser.
Tomado de http://forums.macrumors.com/showthread.php?t=577677
Versión rápida
fuente
viewDidAppear
lugar.indexPathForSelectedRow
llamada puede volver nula, por lo que debe verificarse. La documentación indica : Una ruta de índice que identifica los índices de fila y sección de la fila seleccionada, o nula si la ruta de índice no es válida.¿Subclase
-(void)viewWillAppear:(BOOL)animated
? El UITableViewCell seleccionado no deseleccionará cuando no llame[super viewWillAppear:animated];
a su método personalizado.fuente
Para los usuarios de Swift, agregue esto a su código:
Es la respuesta de paulthenerd, excepto en Swift en lugar de Obj-C.
fuente
Solución Swift 3
fuente
Si está utilizando un UITableViewCell, comente la siguiente línea
Espero que esto ayude.
fuente
Actualizado con Swift 4
Después de algunos experimentos, también basados en respuestas anteriores, tengo la conclusión de que el mejor comportamiento se puede lograr de 2 maneras: (casi idéntico en la práctica)
Personalmente, estoy adoptando la primera solución, porque es simplemente más conciso. Otra posibilidad, si necesita un poco de animación cuando regrese a su tableView, es usar
viewWillAppear
:Por último, pero no menos importante, si está utilizando un UITableViewController, también puede aprovechar la propiedad clearsSelectionOnViewWillAppear .
fuente
Para obtener el comportamiento que Kendall Helmstetter Gelner describe en su comentario, es probable que no desee deseleccionarRowAtIndexPath sino la propiedad clearSsectionOnViewWillAppear en su controlador. ¿Quizás esto se estableció en SÍ por accidente?
Vea el comentario en la plantilla predeterminada de Apple para las nuevas subclases UITableViewController:
fuente
También recibí este problema para mi aplicación de desglose. Después de que un viewcontroller, que llamaré VC, regrese después de presionar otro ViewController, la celda seleccionada en VC permaneció resaltada. En mi aplicación, había creado VC para manejar el segundo nivel (de tres niveles) de mi desglose.
El problema en mi caso es que VC era un UIViewController (que contenía una Vista que contenía un TableView). En su lugar, hice de VC un UITableViewController (que contenía un TableView). La clase UITableViewController maneja automáticamente el resaltado de la celda de la tabla después de regresar de una inserción. La segunda respuesta a la publicación " Problema con deselectRowAtIndexPath en tableView " ofrece una respuesta más completa a este problema.
El problema no se produjo para el controlador de vista raíz porque cuando creé la aplicación como una "Aplicación basada en navegación" en XCode, el controlador de vista raíz resultante ya estaba hecho en la subclase UITableViewController.
fuente
Si ninguno de estos funciona para usted, considere esta solución alternativa:
Use una secuencia de desconexión para llamar:
¿Por qué hacer esto? Principalmente si tiene problemas para ejecutar el código de deselección en el momento adecuado. Tuve problemas con que no funcionara en la vista Aparecerá así que el desenrollado funcionó mucho mejor.
Pasos:
Escriba la secuencia de desenrollado (o pegue desde arriba) en su primer VC (el que está en la tabla)
Ir a la segunda VC. Control-arrastre desde el botón Cancelar / Listo / Etc que está utilizando para descartar ese VC y arrastre hasta el ícono Salir en la parte superior.
Seleccione el desenrollar segue que creó en el paso 1
Buena suerte.
fuente
Estoy usando CoreData, por lo que el código que funcionó para mí fue una combinación de ideas de varias respuestas, en Swift:
fuente
fuente
He tenido el mismo problema durante mucho tiempo, así que en caso de que alguien más esté luchando:
Eche un vistazo a su
-tableView: cellForRowAtIndexPath:
y vea si está creando celdas o está utilizando un 'identificador de reutilización'. Si es esto último, asegúrese de que su tabla en IB tenga una celda con ese identificador. Si no está utilizando un identificador de reutilización, simplemente cree una nueva celda para cada fila.Esto debería dar a su tabla la 'fila seleccionada desvanecida' esperada al aparecer.
fuente
Use este método en la clase UITableViewCell
fuente
Para Swift 3: preferiría que se use en viewDidDisappear
Definir:-
En viewDidDisappear: -
En didSelectRowAtIndexPath: -
fuente
si la celda permanece resaltada después de tocarla, puede llamar al método UITabelView,
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
O bien, puede usar el siguiente método y modificarlo según sus requisitos,
// MARK: UITableViewDelegate
fuente
Xcode 10, Swift 4
Tuve este mismo problema y descubrí que dejé una llamada vacía para verWillAppear en la parte inferior de mi tableViewController. Una vez que eliminé la función de anulación vacía, la fila ya no permaneció resaltada al regresar a la vista tableView.
problema func
eliminar la función vacía resolvió mi problema.
fuente
Solución Swift 5:
fuente