2010-09-05 15 views
15

Ich bin auf dieses wirklich merkwürdige Phänomen gestoßen, das ich nicht recht herausfinden kann. Ich habe einen UITableViewController, der ein UITableView verwaltet. Ziemlich einfach. Ich habe auch einen UISearchDisplayController zum Durchsuchen der Inhalte der Tabellenansicht. Die Suchfunktion kann Elemente des Inhalts löschen, die in der Tabellenansicht angezeigt werden. Wenn der Benutzer also eines der Elemente auswählt, die er beim Suchen gefunden hat, möchte ich nicht nur die Tabellenansicht des UISearchDisplayControllers, sondern auch die Tabellenansicht des UITableViewControllers neu laden. Wenn ich das mache, erscheinen die Abschnitte der regulären Tabellenansicht und werden über dem UISearchDisplayController angezeigt. Es ist wirklich ziemlich seltsam. Ich denke, die beste Art und Weise zu erklären, es mit einem Bild ist:UITableView neu laden hinter UISearchDisplayController

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

Wenn einer von euch wissen, was möglicherweise dieses Problem verursacht werden könnte oder eine Abhilfe wissen, dass wäre fantastisch.

+1

Das gleiche Problem, mehr Screenshots: http://StackOverflow.com/Questions/14994997/UisearchdisplayController-Shows-Header-Section-of-Parent-UseableController – Douglas

+0

Wunderbar, 2 Jahre später ist dies immer noch ein Problem: http: // openradar.appspot.com/14676046 Sieht aus wie Apple nie repariert es, weil sie UISearchDisplayController in iOS 8 ersetzt. – Keab42

Antwort

-1

Hoffentlich haben Sie das jetzt herausgefunden, aber nur für den Fall, dass jemand über diese Frage stolpert: Dies passiert wahrscheinlich, weil Ihr UITableViewController die Datenquelle/Delegat für die Suchtabelle sowie Ihre Haupttabelle ist. Das heißt, vermutlich haben Sie die gleichen UITableViewDelegate/DataSource-Methoden für beide Tabellenansichten ausgeführt, und Sie erhalten dieselbe Abschnittsüberschrift für beide Tabellen. Stellen Sie sicher, dass Sie Ihre Suchergebnisse Tabelle sind Handhabung getrennt:

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

Es ist überraschend, aber das Problem ist wirklich, dass die tatsächlichen Abschnitt Header von der UITableView im Hintergrund über UITableView des UISearchDisplayController zeigen. Beim Scrollen in den Suchergebnissen erscheinen die Kopfzeilen des Hintergrundbereichs fest und schweben über den Suchergebnissen, wenn sich die Suchergebnisse hinter ihnen auf und ab bewegen. – Douglas

+0

Ich sehe das gleiche - schwimmende Header aus der Tabelle darunter. Wir konnten das Problem in iOS 6 umgehen, indem wir [self.searchDisplayController.searchResultsTableView reloadData] an bestimmten Stellen aufrufen, aber es funktioniert nicht in iOS 7. – EricS

7

AKTUALISIERT WIEDER

Wie sich herausstellt, wenn ein Header der Tabelle im Hintergrund nachgeladen wird es ganz gleich vor dem Suchsteuerung erscheint, was .

Ich löste dies, indem ich den holeResultsController deaktiviere (setze ihn auf Null) und lasse ihn wieder langsam laden, wenn die Suche verschwindet.

AKTUALISIERT - Original Antwort unten

In meinem Fall bin ich mit zwei fetchedResultsControllers eine für die Haupt-Tableview und eine für die Suche.

Ich entdeckte, dass das Verhindern von Animationen beim Hinzufügen der Abschnittsüberschriften diesen Fehler verhindert. Während searchDisplayController.active deaktiviere ich einfach die Animation der Sektionswechsel. Siehe Code unten.

- (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; 
     } 
    } 
} 

ORIGINAL ANTWORT

Die andere Antwort tatsächlich funktioniert nicht auf seine eigene. Der Grund dafür ist, dass der Header, der angezeigt wird, keine Kopfzeile in der Tabellenansicht von searchDisplayController ist. Es handelt sich um eine Kopfzeile aus der Haupttabellenansicht, die aus irgendeinem Grund oberhalb der Suchtabellensicht in der Ansichtshierarchie hinzugefügt wird.

Ich löste dieses Problem, indem ich Updates für die Haupttabelle blockierte, während searchDisplayController.active = YES.

In meinem Fall ich bin mit einem lazily geladen geholt Ergebnisse Controller so dass ich es so tat:

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

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

Allerdings habe ich immer noch das Problem, dass wenn ich auf reload auf der Haupttableview wollen, so dass es Im Hintergrund sieht man, dass die Abschnittsüberschriften immer noch vor dem dunklen Bereich schweben.

Hat jemand eine bessere Lösung dafür?Es scheint ein legitimer Fehler für viewForHeaderInSection und titleForHeaderInSection zu sein, wenn Daten erneut geladen werden, während sie von einem UISearchDisplayController abgedeckt werden.

Die einfachste Antwort für mich ist zu versuchen, die Suchansicht zu überschreiben, so dass Sie die Hintergrundtabelle nicht sehen können. Aber das ist weg von der Appleness der App.

2

Ich bin vor kurzem auch dazu gekommen ... der Ansatz, den ich entschied, war, Aktualisierungen an die HaupttableView in einer ausgesetzten seriellen Dispatch-Warteschlange zu warten, bis der UISearchDisplayController die searchResultsTableView verbirgt. Ich würde dies wahrscheinlich als einen Fehler betrachten, da die Abschnittsüberschriften nicht durch die Haupttabelle angezeigt werden sollten, wenn die searchResultsTableView diese Ebene übernommen hat.

3

Unsere Lösung besteht darin, Folgendes zu tun.

  1. In viewForHeaderInSection, Rückkehr nil, wenn self.searchDisplayController.active JA
  2. In didHideSearchResultsTableView ist, [self.tableView reloadData] rufen die Header neu zu laden, wenn die Suchtabelle
0

es behoben, verschwindet: Es wurde nur in iOS 7 getestet. .

die folgenden Zeilen in viewDidLoad

searchDisplayController.searchResultsTableView.delegate = self; 
searchDisplayController.searchResultsTableView.dataSource = self; 
hinzufügen

Das reparierte es für mich ...

2

Ich löste das in iOS 7, indem ich nur die sichtbaren Reihen in der zugrundeliegenden Tabelle neu lud.

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

Das funktionierte für mich. Ich musste jede Sekunde eine Sektion neu laden, was dazu führte, dass die Kopfzeile über meiner Suchtabelle angezeigt wurde. Aus irgendeinem Grund funktioniert das erneute Laden, was sichtbar ist, anstatt die indexPaths selbst anzugeben. Auf jeden Fall ein Fehler. –

+0

Dies funktioniert nur, wenn das zugrunde liegende Datenmodell nicht geändert wurde. – vincentjames501

0
[self.searchDisplayController.searchResultsTableView reloadData]; 
0

Da UITableViewController zu verwenden. self.view ist eine TableView in der UITableViewController und SearchDisplayControllerContainerView ist die self.view von UITableViewController hinzugefügt. Verwenden Sie einfach UIViewcontroller.

0

Meine Lösung bestand darin, das erneute Laden der Tabelle zu vermeiden, wenn die Suchergebnisse angezeigt wurden, und dann jedes Mal neu zu laden, wenn die Suchergebnisse abgelehnt wurden.

Ich musste einen symbolischen Haltepunkt auf UITableView reloadData festlegen, um alle Aufrufe zum Neuladen zu finden, die dazu führten, dass die Abschnittsüberschriften über der Suchtabelle neu gezeichnet wurden.