actualizado de nuevo
Como resultado, si la cabecera de una mesa se vuelve a cargar en el fondo que aparece en la parte frontal del controlador de búsqueda, no importa lo .
Lo resolví deshabilitando el control fetchedResultsController (estableciéndolo en cero) y dejándolo cargar perezosamente de nuevo cuando sea necesario cuando la búsqueda desaparece.
ACTUALIZADO - Respuesta original por debajo
En mi caso estoy usando dos fetchedResultsControllers uno para el tableview principal y uno para la búsqueda.
Descubrí que la prevención de animaciones al agregar los encabezados de las secciones previene este error. Entonces, mientras searchDisplayController.active simplemente deshabilito la animación 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í mismo. 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 tabla principal que, por alguna razón, se agrega encima de la vista de tabla de búsqueda en la jerarquía de vistas.
He resuelto este problema al deshabilitar las actualizaciones de la tabla principal mientras searchDisplayController.active = YES.
En mi caso estoy usando un controlador resultados traída perezosamente cargado 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 reloadData en el tableview principal, así que se ve en el fondo, los encabezados de las secciones todavía 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 fondo. Pero eso le quita a Appleness de la aplicación.
Mismo problema, más capturas de pantalla: http://stackoverflow.com/questions/14994997/uisearchdisplaycontroller-shows-header-section-of-parent-uitableviewcontroller – Douglas
Maravillosamente, 2 años después, esto sigue siendo un problema: http: // openradar.appspot.com/14676046 Parece que Apple nunca lo solucionó porque reemplazaron a UISearchDisplayController en iOS 8. – Keab42