Recarga de UITableView detrás de UISearchDisplayController

Me he encontrado con este fenómeno realmente extraño que no puedo entender. Tengo un UITableViewController que administra una UITableView. Bastante simple. También tengo un UISearchDisplayController para search los contenidos de la vista de tabla. La funcionalidad de búsqueda podrá eliminar elementos del contenido que se muestra en la vista de la tabla. Entonces, si el usuario elige eliminar uno de los elementos que encontraron mientras buscaba, no solo quiero volver a cargar la vista de tabla de UISearchDisplayController, sino también la vista de tabla de UITableViewController. Cuando hago eso, las secciones de la vista de tabla normal salen y se muestran encima del UISearchDisplayController. Es realmente bastante extraño. Creo que la mejor manera de explicarlo es con una image:

http://img46.imageshack.us/img46/2818/screenshot20100905at140.png

Si alguno de ustedes sabe lo que podría estar causando este problema o saber una solución, sería fantástico.

ACTUALIZADO DE NUEVO

Como resultado, si el encabezado de una tabla se recarga en segundo plano, aparece delante del controller de búsqueda sin importar qué.

Resolví esto deshabilitando el fetchedResultsController (configurándolo a cero) y dejándolo cargar perezosamente nuevamente cuando sea necesario cuando la búsqueda desaparece.

ACTUALIZADO – Respuesta original a continuación

En mi caso, estoy usando dos fetchedResultsControllers uno para la vista de tabla principal y otro para la búsqueda.

Descubrí que la prevención de animaciones al agregar los encabezados de sección previene este error. Entonces, mientras searchDisplayController.active simplemente deshabilito la animation del cambio de sección. ver el código a continuación.

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { if (!self.reordering) { UITableView *myTableView = controller == __fetchedResultsController ? self.tableView : self.searchDisplayController.searchResultsTableView; UITableViewRowAnimation animation; if (self.searchDisplayController.active) { animation = UITableViewRowAnimationNone; } else { animation = UITableViewRowAnimationFade; } switch(type) { case NSFetchedResultsChangeInsert: [myTableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:animation]; break; case NSFetchedResultsChangeDelete: [myTableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:animation]; break; } } } 

RESPUESTA ORIGINAL

La otra respuesta en realidad no funciona por sí misma. La razón es que el encabezado que se muestra no es un encabezado en la vista de tabla de searchDisplayController. Es un encabezado de la vista de tabla principal que, por alguna razón, se agrega por encima de la vista de la tabla de búsqueda en la jerarquía de la vista.

Resolví este problema deshabilitando las actualizaciones en la vista de tabla principal mientras searchDisplayController.active = YES.

En mi caso, estoy usando un controller de resultados descargado cargado perezosamente, así que lo hice así:

 - (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView { [self.tableView reloadData]; } - (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView { self.fetchedResultsController.delegate = nil; self.fetchedResultsController = nil; } 

Sin embargo, todavía tengo el problema de que si quiero volver a cargar datos en la vista de tabla principal para que se vea en segundo plano, los encabezados de sección aún flotan en frente del área oscurecida.

¿Alguien tiene una mejor solución para esto? Parece un error legítimo para viewForHeaderInSection y titleForHeaderInSection cuando los datos se vuelven a cargar mientras están cubiertos por un UISearchDisplayController.

La respuesta más simple para mí es intentar anular la vista de búsqueda para que no pueda ver la tabla de background. Pero eso le quita la "aplicación" de la aplicación.

Nuestra solución es hacer lo siguiente. Solo se ha probado en iOS 7:

  1. En viewForHeaderInSection , devuelve nil si self.searchDisplayController.active es YES
  2. En didHideSearchResultsTableView , llame a [self.tableView reloadData] para volver a cargar los encabezados cuando la tabla de búsqueda desaparece

También me encontré con esto recientemente … el enfoque que decidí era poner en queue las actualizaciones del tableView en una queue de envío en serie suspendida hasta que el UISearchDisplayController oculte el searchResultsTableView. Probablemente consideraría esto un error ya que los encabezados de sección no deberían mostrarse a través de la tabla principalView si searchResultsTableView ha tomado esa capa.

Resolví esto en iOS 7 simplemente recargando las filas visibles en la tabla subyacente.

 - (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView { [self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone]; } 

Arreglado..

Agregue las siguientes líneas en viewDidLoad

 searchDisplayController.searchResultsTableView.delegate = self; searchDisplayController.searchResultsTableView.dataSource = self; 

Eso lo arregló para mí …

 [self.searchDisplayController.searchResultsTableView reloadData]; 

Debido al uso de UITableViewController . self.view es un TableView en el UITableViewController y el self.view de UITableViewController se agrega a la self.view de UITableViewController . Solo usa UIViewcontroller .

Mi solución era evitar volver a cargar la tabla si se mostraran los resultados de búsqueda, y luego volvía a cargar cada vez que se descartaban los resultados de búsqueda.

Tuve que establecer un punto de corte simbólico en UITableView reloadData para encontrar todas las llamadas a la recarga que causaban que los encabezados de la sección se networkingibujasen la parte superior de la tabla de búsqueda.

Es de esperar que ya haya resuelto esto, pero en caso de que alguien tropiece con esta pregunta: probablemente esto suceda porque su UITableViewController es el origen / delegado de datos para la tabla de búsqueda, así como para su tabla principal. Es decir, presumiblemente, tiene los mismos methods UITableViewDelegate / DataSource ejecutándose para ambas vistas de tabla, y está devolviendo el mismo encabezado de sección para ambas tablas. Asegúrese de manejar la tabla de resultados de búsqueda por separado:

 - (NSString *)tableView:(UITableView *)aTableView titleForHeaderInSection:(NSInteger)section { if (aTableView == [[self searchDisplayController] searchResultsTableView]) { return nil; } // Return a title appropriate for self.tableView here }