How do you dismiss a UISearchController ? (iOS 8 and follow)

SwiftUisearchcontroller

Swift 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionArnaudView Question on Stackoverflow
Solution 1 - SwiftArnaudView Answer on Stackoverflow
Solution 2 - SwiftYaoyu YangView Answer on Stackoverflow
Solution 3 - SwifthalbanoView Answer on Stackoverflow
Solution 4 - SwiftBoris NikolicView Answer on Stackoverflow
Solution 5 - SwiftMSamsoniukView Answer on Stackoverflow