How do you dismiss a UISearchController ? (iOS 8 and follow)
SwiftUisearchcontrollerSwift Problem Overview
This must be trivial, but I can't find how you're supposed to dismiss a UISearchController programmatically?
Note that it's the new UISearchController (introduced in 2014 with iOS 8), not the UISearchDisplayController.
So far here's what I've got
// Dismiss the search tableview
searchController.dismissViewControllerAnimated()
// Clear the Search bar text
searchController.active = false
But I still have the cancel button and can't get rid of it.
Swift Solutions
Solution 1 - Swift
OK so after more testing, turns out you just have to set:
searchController.active = false
// or swift 4+
searchController.isActive = false
This is the first thing I tried but I called it in one of the UISearchControllerDelegate methods which didn't work (probably should have called it with dispatch_async (halbano's answer seems to confirm that)).
Anyway, since I couldn't find that answer online, I'm answering my own question, I hope that it'll help someone.
Solution 2 - Swift
Did you have this problem when you try to dismiss search controller after segueing to another view? I have encountered this problem too. I think you might want to use
self.definesPresentationContext = true
in the view controller that presents the UISearchController as per this post <https://stackoverflow.com/questions/29610873/uisearchcontroller-not-dismissed-when-view-is-pushed>;. It works for me.
Solution 3 - Swift
I was presenting the mine embed on a navigation bar. The code that works for me was:
- (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;
});
}
Hope it helps someone.
Solution 4 - Swift
SWIFT 4+
searchController.isActive = false
Solution 5 - Swift
I had this problem using the search and interactionController, solved after just include the line: self.dismissViewControllerAnimated(false, completion: nil)
Open the interaction and clear the search without changes in the delegate.