2011-12-16 9 views
16

Tengo un UITableView con celdas en un guión gráfico, y un segue que conecta las celdas a otra vista.UITableViewCells no anula la selección al regresar de un segue

Cuando selecciona una celda, muestra la animación de selección de celda (convirtiendo la celda en gris, en mi caso) y empuja la otra vista a la pantalla. Pero cuando regresa a la vista de tabla, la animación de deselección no se muestra en absoluto (al revés de la animación de selección). Como solo estoy usando un segue, esperaba que esto se solucionara por defecto.

¿Hay alguna manera de obligarlo a mostrar la animación de deselección?

+0

encontrado la solución aquí: http://stackoverflow.com/questions/1840614/why-does-uitableview-cell-remain-highlighted. –

Respuesta

11

No estoy seguro sobre el uso de segues pero a menudo desea actualizar los datos cuando aparece un controlador de vista. Sin embargo, si vuelve a cargar la tabla, borrará la fila de selección. Aquí hay un código que uso para mantener una fila seleccionada y mostrar la anulación de la selección al regresar. Puede ser que esto te ayude, así que lo publicaré aquí.

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    NSIndexPath *indexPath = [tableView indexPathForSelectedRow]; 
    [tableView reloadData]; 
    if(indexPath) { 
     [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; 
    } 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    NSIndexPath *indexPath = [tableView indexPathForSelectedRow]; 
    if(indexPath) { 
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    } 
} 
+0

Recargo los datos de la tabla, pero su solución no funcionó. (Lo había intentado antes, pero para estar seguro lo intenté de nuevo.) –

+0

¿Está recargando la tabla en otro lugar? También asegúrese de no eliminar la fila seleccionada antes de llamar a viewWillAppear. Dependiendo de cómo cambien sus datos, volver a seleccionar la misma fila puede no funcionar para usted. – Chase

+0

Acepté esto aunque nunca resolví este problema. Supongo que debo volver a cargar en alguna parte. –

22

Esto se manejaría automáticamente si su controlador de vista fuera una subclase de UITableViewController y clearsSelectedOnViewWillAppear se configuró en YES (que es el valor predeterminado).

En su caso, puede hacer esto de la misma manera que lo hace UITableViewController. Deseleccione la fila seleccionada en -viewWillAppear:.

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; 
    [self.tableView deselectRowAtIndexPath:selectedIndexPath animated:YES]; 
} 
+0

Mi controlador de vista es una subclase de UITableViewController. La celda se deselecciona cuando se muestra, simplemente no muestra una animación; está deseleccionada para comenzar. (Por si acaso, intenté con lo que sugirió y no funcionó). –

+0

Acabo de crear un proyecto de muestra con un 'UITableViewController' en un' UINavigationController' que empuja a otro controlador de vista. Todo configurado usando un guión gráfico con segues y mostrando el controlador de vista muestra la animación de deselección. Quizás la vista del controlador de vista original se está descargando, por lo que se pierde el estado de selección de la tabla. Esto puede suceder en situaciones de presión de memoria alta. –

+0

Mi aplicación está configurada como usted describe (pero con pestañas también), y utiliza datos principales. La mayoría de las solicitudes en este momento son solo dos o tres registros (para las pruebas), por lo que no creo que sea una pérdida de recursos de memoria. –

9

Asegúrese de que está llamando a la super implementaciones de los métodos viewWill... y viewDid...

+0

Lo hago en todos los métodos heredados. –

+0

¿Cómo regresa a su UITableViewController? ¿Estás usando el botón de retroceso predeterminado que viene gratis cuando usas un segue "push" en el guión gráfico? –

+0

Yo soy. Mi UITableViewController está dentro de un UINavigationController, y vuelvo a la vista de tabla desde la vista de detalles con el botón Atrás que crea el controlador de navegación. (y el segue es un tipo '' push'') –

1

Swift Actualización: -

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(true) 
    if tableView.indexPathForSelectedRow != nil { 
     let indexPath: NSIndexPath = tableView.indexPathForSelectedRow! 
     tableView.deselectRowAtIndexPath(indexPath, animated: true) 
    } 
} 
1

Mejor actualización Swift:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    if let path = tableView.indexPathForSelectedRow { 

     tableView.deselectRowAtIndexPath(path, animated: true) 
    } 
} 
2

Para Swift 3

override func viewWillAppear(_ animated: Bool) { 

    super.viewWillAppear(animated) 
    if let path = tableView.indexPathForSelectedRow { 

     tableView.deselectRow(at: path, animated: true) 
    } 
} 
Cuestiones relacionadas