ios 13 - Custom SearchBar with UISearchBar _searchField not working
If we want to support iOS 12 and earlier also while compiling with Xcode 11, then we can make an extension of UISearchBar
where we can grab the textfield
extension UISearchBar {
var textField : UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
} else { // Fallback on earlier versions
for subview in subviews.first?.subviews ?? [] {
if let textField = subview as? UITextField {
return textField
}
}
}
return nil
}
}
USAGE
searchBar.textField?.font = UIFont.systemFont(ofSize: 15.0)
Here we can access all textField's properties and modify as per our needs in UISearchBar
There is a change in the view hierarchy.
So by printing self.subviews[0]).subviews
where self
in UISearchBar
For iOS 12 and earlier
For iOS 13+
Along with UISearchBarBackground
, now we have UISearchBarSearchContainerView
and UISearchBarScopeContainerView
whereas UISearchBarTextField
is missing which is replaced by an extension provided by Apple in UISearchTextField
class
extension UISearchBar {
open var searchTextField: UISearchTextField { get }
}
So we can directly access searchBar.searchTextField
in iOS 13 and above devices whereas it will lead to a crash if we try to access this property in iOS 12 and below OS devices.
The crash will be like this:
[UISearchBar searchTextField]: unrecognized selector sent to instance
Here is the Apple doc for this
The SDK now provides UISearchBar.searchTextField
so you can simply replace your private API implementation with the public API.
searchBar.searchTextField.backgroundColor = [UIColor blueColor];