2009-08-10 3 views
7

Ich habe einen UITabBar Controller, der mehrere Controller verwaltet (mit SDK 3.0). Einer davon ist ein TableView-Controller und ich muss eine Suchfunktion mit dem UISearchDisplayController bereitstellen. Der gesamte Code basiert auf dem Beispiel von Apple TableSearch. Wenn Sie jedoch auf die Registerkarte klicken, wird der tabellarische Controller mit dem zugehörigen Inhalt angezeigt. Es wird jedoch keine searchBar angezeigt. Ich habe die Xib in IB überprüft, um sicherzustellen, dass alle Steckdosen richtig eingestellt sind, aber egal was ich versuche, self.searchDisplayController ist immer Null und die Suchleiste erscheint nicht.Wie verwende ich UISearchDisplayController von einem Controller in einem UITabBar Controller?

In der Praxis habe ich MainView.xib aus dem TableSearch-Beispiel repliziert und die Eigentümerklasse der Datei auf die richtige Controller-Klasse für die Registerkarte festgelegt. Die Ausgänge sind Sets wie im Beispiel MainView.xib. Fehle ich irgendeinen wichtigen Schritt oder mache ich etwas falsch?

Vielen Dank im Voraus.

Antwort

1

Ok, ich habe herausgefunden, wie man es löst. In meinem Fall war das Problem auf die Tatsache zurückzuführen, dass ich einen Controller verwendete, der im UITabBarController als eine seiner verwalteten Registerkarten (d. H. Als Kind) eingebettet war.

Entfernen des Controllers vom UITabBarController, dann Hinzufügen eines UINavigationController zum UITabBarController, und schließlich setzen mein Controller als Kind des UINavigationController löste vollständig das Problem.

Ich verstehe nicht, warum das so ist (es gibt keine verwandten Informationen in der Dokumentation, wie oft passiert); Aber es funktioniert jetzt wie ein Zauber. Mit freundlichen Grüßen.

+0

Dies funktioniert immer noch ab November 2017. Es gibt ein gutes Diagramm, das zeigt, wie man den UINavigationController zur Registerkarte [hier] hinzufügt (https://stackoverflow.com/a/37357242/1359088). –

1

ich dieses Problem haben :(Ist die Suchleiste hinter dem Tableview versteckt zu werden?

@unforgiven, Sie dies habe versucht ...?

searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, 320, 40)]; 
[self.tableView setTableHeaderView: searchBar]; 

Diese manuell searchbar erstellt und es funktioniert. Aber ich einige dumme Fehler in IB zu machen, dass die SearchBar nicht, obwohl meine Verbindungen perfekt sind nicht angezeigt. :-(

Do diesen Beitrag aktualisieren, wenn Sie die Antwort erhalten ...

1

Ich hatte ein ähnliches Problem

ich einen zusätzlichen Schritt tun lösen musste unforgivens In meinem Hauptspitze

1) erstellen UITabController 2) beantwortet Dann zog ich in einen UINavigational-Controller aus der Tab Controller 3) Dann einen UITableViewController als Kind in den NavigationalController gezogen 4) Dann änderte (3) Klasse als MyTableWithSearchBarViewController im Inspektor - überprüfe ob der Name korrekt ist und ändere dies wenn nötig im Inspektor als gut 5) Ich dann musste das TableView löschen, welches automatisch von IB in Schritt (3) erstellt wurde. Erst dann würde die Suchleiste anzeigen richtig ...

Wenn in Schritt 3 I einen anderen Controller auf die Bühne gezerrt oder die Tableview links dort würde es immer nur die Tabelle angezeigt werden und nicht die Suchleiste

seltsam

5

Ich hatte das gleiche Problem und stolperte zufällig über diese Lösung ...

Wenn Sie Ihren Tabellenansicht-Controller (z. B. UISearchDisplayController) in einer Tab-Leiste oder einem Navigationscontroller mit dem Interface Builder verschachtelt haben, müssen Sie im Fenster "Attributes Inspector" den "Nib-Namen" festlegen.

Der Nib-Name ist derjenige, der die Tabellenansicht enthält und den Controller (z. B. UISearchDisplayController) als Besitzer der Datei hat.

1

Tomtrapeze hat die richtige Antwort, wenn Ihre NIB-Datei den UITableViewController enthält. Wenn Sie jedoch den UITableViewController im Code laden - zum Beispiel, indem Sie ihn auf den Stack eines UINavigationControllers schieben -, ist die Lösung ein wenig anders.

Wenn Sie den UITableViewController oder die Unterklasse initialisieren, müssen Sie den Initializer -initWithNibName: bundle: verwenden und den Namen Ihrer NIB-Datei angeben. Alternativ dazu können Sie den Initializer -initWithStyle: initializer verwenden und die Eigenschaft nibName manuell festlegen, bevor die Ansicht geladen wird.

Wenn die Eigenschaft nibName beim Laden der Ansicht nicht festgelegt ist, verwendet UITableViewController nicht die normale UIViewController-Nib-Lookuplogik. Es wird nur ein Standard-UITableView geladen.

0

Eine andere mögliche Lösung, die für mich funktioniert, ist das UITableViewController mit initWithNibName init: Bundle:

SearchEntryTableViewController* searchEntryTableViewController = [[SearchEntryTableViewController alloc]initWithNibName:@"SearchEntryTableViewController" bundle:nil]; 

die UITableViewController in einem UINavigationController Um Nest, bevor sie in einem UITabBarController setzen sich die Frage für mich nicht beheben. ..

1

Ich habe vor kurzem gelernt, dass ich NIB-Dateien mit [[MyViewController alloc] initWithNibName:nil bundle:nil]; laden konnte, wenn die NIB-Datei den gleichen Namen wie die Klasse hat (dh MyViewController.xib). Es stellt sich heraus, dass das Initialisieren dieses Weges die UISearchBar and UISearchBarDisplayController nicht anzeigt. Als ich den View-Controller initialisierte, indem ich tatsächlich den Namen der Klasse eintippte, wurde meine Suchleiste korrekt angezeigt. Ich dachte zuerst, dass es etwas damit zu tun hat, wie ich den View-Controller präsentierte, war aber froh, dass es nicht war.

PGWSearchViewController *searchVC = [[PGWSearchViewController alloc] initWithNibName:@"PGWSearchViewController" bundle:nil]; 

searchVC.modalPresentationStyle = UIModalPresentationFullScreen; 
searchVC.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 

[self presentViewController:searchVC animated:YES completion:^{ }]; 

Dies verwendet iOS SDK 5.1 und XCode 4.3.1.

+0

Ja, die Dinge sind jetzt viel besser, mit SDK 5.1. –