2016-04-25 12 views
3

Wenn Sie eine UISearchController-Suchleiste in der navigationItem-Titelansicht festlegen, kann die Suchleiste nicht bearbeitet werden.UISearchController UISearchBar kann nicht in navigationItem titleView bearbeitet werden

In meinem ViewDidLoad konfiguriere ich einen UISearchController.

self.searchViewController = [self.storyboard instantiateViewControllerWithIdentifier:NSStringFromClass([SearchViewController class])]; 
self.searchViewController.delegate = self; 
self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchViewController]; 
self.searchController.delegate = self; 
self.searchController.searchResultsUpdater = self; 
self.searchController.searchBar.delegate = self; 
self.navigationItem.titleView = self.searchController.searchBar; 

Ich kann nicht auf die Suchleiste tippen. Der Cursor erscheint nicht und es gibt keine Benutzerinteraktion.

Seltsamerweise, wenn ich den UISearchController lokal initialisieren, ohne es auf eine Eigenschaft zu setzen, dann kann ich die Suchleiste bearbeiten, nur keine Delegaten Callbacks.

Ein anderes interessantes Verhalten ist, dass der Clear-Button funktioniert (wenn ein Text in der Suchleiste während der Initialisierung gesetzt wird).

+0

Ich habe das gleiche Problem, und keine der vorgeschlagenen Antworten funktionieren. Hast du eine Lösung dafür gefunden? –

+0

@ SilviaHisham ja, was für mich arbeitete, ist in meiner Antwort unter http://stackoverflow.com/a/36893699/4099344 – appsyoon

Antwort

7

Ich setze self.definesPresentationContext = YES; in der View-Controller, die den View-Controller in Frage stellt.

Dies muss auf self.definesPresentationContext = NO; in viewWillAppear: eingestellt werden.

Jetzt kann die Suchleiste im dargestellten View-Controller bearbeitet werden.

+0

set self.definesPresentationContext = NO; in welchem ​​ViewController genau? der, der den UISearchController oder den davor hat? –

+1

@SilviaHisham Sie können meine Antwort zur Klarstellung ansehen http://Stackoverflow.com/a/42148381/976628 –

0

In Ihrem ersten Codeblock instanziieren Sie mit einer SearchViewController Kennung. In der zweiten verwenden Sie HBSearchViewController. Dies deutet darauf hin, dass es möglicherweise einen anderen Unterschied in Ihrem Code neben dem Verwenden/Nichtbenutzen einer Steckdose gibt.

+0

Sorry, das ist mein Fehler. Ich habe das Präfix im ersten Codeblock entfernt, in der Sekunde vergessen. – appsyoon

1

Legen Sie Ihre Suchleiste zur Navigation Titelansicht:

self.navigationItem.titleView = self.searchBarTop; 

dann setzen gerade diese Ansicht entweder links/rechts von Navigationsleiste

UIBarButtonItem *searchBarItem = [[UIBarButtonItem alloc] initWithCustomView:searchBar]; 
self.navigationItem.rightBarButtonItem = searchBarItem; 

Ich hoffe, das die Arbeit für Sie !!

1

Ich habe gerade ein sehr ähnliches Problem in meiner App gelöst und dachte, ich würde die Lösung teilen, falls die bestehenden Lösungen es nicht für Sie beheben.

In meinem Fall hatte ich eine Tab-Leiste-Anwendung, mit meinen benutzerdefinierten Controllern in den Registerkarten, eingebettet in die Navigations-Controller. Die Symptome waren genau gleich, die Suchleiste erschien im Titelbereich der Navigationsleiste, war aber nicht interaktiv.

Ich habe festgestellt, dass das Problem war, dass ich meine benutzerdefinierte Unterklasse des UITabBarController verwendet und ich habe die viewWillAppear(animated:) Methode überschrieben, aber vergessen, super.viewWillAppear(animated:) in der Implementierung aufzurufen. Das zusätzliche Symptom war, dass, als ich die Tabs wechselte, die Suchleiste plötzlich interaktiv wurde und alles gut funktionierte, nur die Interaktion auf der ersten Registerkarte wurde deaktiviert.

Ich hoffe, das hilft jemandem.

4

Ich hatte das gleiche Problem.

Stellen Sie sich vor, Sie haben FirstViewController und SecondViewController und booth haben eine UISearchBar in der titleView.

Um das Problem zu beheben, hatte ich diesen Code zu Stand UIViewController.

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    self.definesPresentationContext = true 

} 

override func viewWillDisappear(animated: Bool) { 
    super.viewWillDisappear(animated) 

    self.definesPresentationContext = false 

} 
+1

Vielen Dank! Ihre Antwort ist die einzige, die für mich funktioniert hat. –