2010-09-05 8 views
15

Me he encontrado con este fenómeno realmente extraño que no puedo descifrar. Tengo un UITableViewController que gestiona una UITableView. Bastante simple. También tengo un UISearchDisplayController para buscar el contenido de la vista de tabla. La funcionalidad de búsqueda podrá eliminar elementos del contenido mostrado por la vista de tabla. Entonces, si el usuario elige eliminar uno de los elementos que encontraron durante la búsqueda, 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 arriba del UISearchDisplayController. Es realmente bastante extraño. Creo que la mejor manera de explicarlo es con una imagen:Recargando UITableView detrás de UISearchDisplayController

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

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

+1

Mismo problema, más capturas de pantalla: http://stackoverflow.com/questions/14994997/uisearchdisplaycontroller-shows-header-section-of-parent-uitableviewcontroller – Douglas

+0

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

Respuesta

-1

Afortunadamente ya se ha dado cuenta de esto, pero por si acaso alguien tropieza con esta pregunta: esto probablemente esté sucediendo porque su UITableViewController es el origen de datos/delegado para la tabla de búsqueda y su tabla principal. Es decir, presumiblemente, tiene los mismos métodos UITableViewDelegate/DataSource ejecutándose para ambas vistas de tabla, y está devolviendo el mismo encabezado de sección para ambas tablas. Asegúrese de que está manejando su 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 
} 
+2

Es sorprendente, pero el problema es que los encabezados de secciones reales de UITableView en el fondo se muestran arriba de UITableView de UISearchDisplayController. Al desplazarse por los resultados de búsqueda, los encabezados de la sección de fondo aparecen fijos, flotando sobre los resultados de búsqueda a medida que los resultados de búsqueda se mueven hacia arriba y hacia abajo detrás de ellos. – Douglas

+0

Veo lo mismo: encabezados flotantes de la tabla debajo. Pudimos solucionar el problema en iOS 6 llamando a [self.searchDisplayController.searchResultsTableView reloadData] en ciertos lugares, pero no funciona en iOS 7. – EricS

7

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.

2

Me encontré con esto recientemente también ... el enfoque que decidí fue poner en cola las actualizaciones de tableView principal en una cola suspendida de distribución en serie hasta que el UISearchDisplayController oculte el searchResultsTableView. Probablemente lo consideraría un error ya que los encabezados de sección no deberían mostrarse a través de la tabla principal. Vea si searchResultsTableView ha tomado esa capa.

3

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

  1. En viewForHeaderInSection, nil de vuelta si self.searchDisplayController.active es sí
  2. En didHideSearchResultsTableView, llame [self.tableView reloadData] para recargar las cabeceras cuando la tabla de búsqueda desaparece
0

arreglaron. .

Añadir las siguientes líneas en viewDidLoad

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

Eso lo arregló para mí ...

2

Lo resolví en iOS 7 al volver a cargar las filas visibles en la tabla subyacente.

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

Esto funcionó para mí. Tenía una sección de recarga cada segundo que hacía que el encabezado se mostrara en la parte superior de mi vista de búsqueda. Por alguna razón, volver a cargar lo que es visible, en lugar de especificar los IndexPaths, sí funciona. Definitivamente es un error. –

+0

Esto solo funcionará si el modelo de datos subyacente no ha cambiado. – vincentjames501

0
[self.searchDisplayController.searchResultsTableView reloadData]; 
0

Debido a utilizar UITableViewController. self.view es un TableView en el UITableViewController y SearchDisplayController 'ContainerView se agrega al self.view de UITableViewController. Simplemente use UIViewcontroller.

0

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

Tuve que establecer un punto de inflexión simbólico en UITableView reloadData para encontrar todas las llamadas a recargar que causaban que los encabezados de las secciones se volvieran a dibujar encima de la tabla de búsqueda.

Cuestiones relacionadas