2015-02-10 10 views
49

Das muss trivial sein, aber ich kann nicht finden, wie Sie einen UISearchController programmatisch abweisen sollen?Wie verwerfen Sie einen UISearchController? (iOS 8 und folgen)

Beachten Sie, dass es sich um den neuen UISearchController handelt, der 2014 mit iOS 8 eingeführt wurde, nicht über den UISearchDisplayController.

weit hier ist also, was ich

// Dismiss the search tableview 
searchController.dismissViewControllerAnimated() 
// Clear the Search bar text 
searchController.active = false 

haben Aber ich habe immer noch die Taste abbrechen und nicht davon lassen kann befreien.

Antwort

114

OK so nach mehr Tests, stellt sich heraus, man muss nur gesetzt:

searchController.active = false 
// or swift 4+ 
searchController.isActive = false 

Dies ist das erste, was ich versucht, aber ich nannte es in einem der UISearchControllerDelegate Methoden, die nicht (wahrscheinlich nicht funktioniert sollte habe es mit dispatch_async aufgerufen (halbano's Antwort scheint das zu bestätigen)).

Wie auch immer, da ich diese Antwort online nicht finden konnte, beantworte ich meine eigene Frage, ich hoffe, dass es jemandem helfen wird.

+1

Dies funktioniert tatsächlich! Idk, wie nur eine Variable ändern tatsächlich löst UI Neuzeichnen, aber es funktioniert – Bhargav

+1

@Bhargav Wahrscheinlich weil es einige KVO (Key Value Observing) geht auf – Nycen

+1

Plus es ruft 'UISearchControllerDelegate's' didDismissSearchController (searchController) 'Methode. –

15

Hatten Sie dieses Problem, wenn Sie versuchen, den Such-Controller nach einer anderen Ansicht zu schließen? Ich bin auch auf dieses Problem gestoßen. Ich glaube, Sie könnten

self.definesPresentationContext = true 

im View-Controller, der die UISearchController präsentiert gemäß diesem Beitrag UISearchController not dismissed when View is pushed verwenden möchten. Für mich geht das.

9

Ich präsentierte die Mine eingebettet in einer Navigationsleiste. Der Code, der für mich funktioniert, war:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.searchController setActive:NO]; 
     self.navigationController.navigationBar.topItem.title = @"MYTITLE".uppercaseString; 
     self.navigationItem.titleView = nil; 
    }); 
} 

Ich hoffe, es hilft jemandem.

+3

war nicht der genaue Code, aber der Versand async wies mich in die richtige Richtung! – kennydust

+0

Gut! Auch der Hauptthread zur Handhabung von UI-Elementen ist obligatorisch, vielleicht war das die Magie. – halbano

0

Ich hatte dieses Problem die Suche und interactionController verwenden, gelöst nach sind nur die Zeile: self.dismissViewControllerAnimated (false, Fertigstellung: nil)

Öffnen Sie die Interaktion und deaktivieren Sie die Suche ohne Änderungen der Delegierten.

+0

Das Problem ist, dass dies einige Delegat-Funktionen wie 'willDismissSearchController' nicht auslösen kann. – aasatt

0

SWIFT 4+

searchController.isActive = false 
Verwandte Themen