Hiding Cancel button on search bar in UISearchController
Solution 1
I ended up subclassing both UISearchBar
and UISearchController
as suggested:
CustomSearchBar.swift
import UIKit
class CustomSearchBar: UISearchBar {
override func layoutSubviews() {
super.layoutSubviews()
setShowsCancelButton(false, animated: false)
}
}
CustomSearchController.swift
import UIKit
class CustomSearchController: UISearchController, UISearchBarDelegate {
lazy var _searchBar: CustomSearchBar = {
[unowned self] in
let result = CustomSearchBar(frame: CGRectZero)
result.delegate = self
return result
}()
override var searchBar: UISearchBar {
get {
return _searchBar
}
}
}
Solution 2
Rejoice! As of iOS 13, there is access to automaticallyShowsCancelButton
on UISearchController
. Set it to false
to hide the cancel button.
Solution 3
func didPresentSearchController(_ searchController: UISearchController) {
searchController.searchBar.becomeFirstResponder()
searchController.searchBar.showsCancelButton = true
}
func didDismissSearchController(_ searchController: UISearchController) {
searchController.searchBar.showsCancelButton = false
}
In my case all the above solutions dint work. You need to show in didPresentSearchController and hide it in didDismissSearchController. Earlier I was just hiding in didDismissSearchController which was still showing Cancel button on cancelling.
Solution 4
Try subclassing UISearchBar
and implement:
override func layoutSubviews() {
super.layoutSubviews()
self.setShowsCancelButton(false, animated: false)
}
This SO thread may help you more in this direction.
Solution 5
Hide the Cancel button in search bar delegate methods and set your delegate searchController.searchBar.delegate=self
UISearchBarDelegate
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
}
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
}
Griffith
An experienced full-stack engineer with specialization in web technologies who is extremely passionate about performance optimization and scalability. #SOreadytohelp
Updated on July 21, 2022Comments
-
Griffith almost 2 years
I'm trying to hide the Cancel button of the search bar in the UISearchController, but unfortunately setting the following in viewDidLoad() does not work:
override func viewDidLoad() { super.viewDidLoad() searchResultsTableController = UITableViewController() searchResultsTableController.tableView.delegate = self searchController = UISearchController(searchResultsController: searchResultsTableController) searchController.searchResultsUpdater = self searchController.searchBar.sizeToFit() searchResultsView.tableHeaderView = searchController.searchBar searchController.delegate = self searchController.dimsBackgroundDuringPresentation = false searchController.searchBar.delegate = self searchController.searchBar.searchBarStyle = .Minimal searchController.searchBar.showsCancelButton = false definesPresentationContext = true }
I have also tried using the above code in this delegate method:
func didPresentSearchController(searchController: UISearchController) { searchController.searchBar.showsCancelButton = false }
This approach works but will show the Cancel button briefly before hiding it, which is not ideal. Any suggestions?
-
Griffith over 8 yearsUnfortunately this doesn't work. The Cancel button still shows up unaffected.
-
Mukesh over 8 yearshave u set the delegate properly,check whether delegate func are getting called or not?Its working on ma end
-
Adrian over 7 yearsThank you for posting this solution. I'm going to file a radar for this, as one would expect
setShowsCancelButton
would stick throughout the object's lifecycle using the factory object. -
Adrian over 7 yearsFiled radar # 29859105
-
Ikhsan Assaat about 7 yearsI'm on Swift 3 & iOS 10 and this almost works. Instead, I tried other answer from this thread and got a result. Instead of overriding
layoutSubviews
, you overridesetShowsCancelButton(:animated:)
.