Ответ 1
SDK теперь предоставляет UISearchBar.searchTextField
, так что вы можете просто заменить свою реализацию частного API на публичный API.
searchBar.searchTextField.backgroundColor = [UIColor blueColor];
Перед Xcode-11-Beta (ios13) ниже приведен код для настраиваемого значения панели поиска для ключа, чтобы textField работал нормально. Теперь получаю журнал аварий ниже.
"NSGenericException", причина: "Доступ к UISearchBar _searchField ivar запрещен. Это ошибка приложения
- (UITextField *)textField
{
return [self valueForKey:@"_searchField"];
}
Любая помощь приветствуется.
SDK теперь предоставляет UISearchBar.searchTextField
, так что вы можете просто заменить свою реализацию частного API на публичный API.
searchBar.searchTextField.backgroundColor = [UIColor blueColor];
У меня был тот же сбой, с IOS 13 вам больше не нужно .value(forKey :)
Вот строка, которая вызвала сбой:
if let searchField = searchController.searchBar.value(forKey: "_searchField") as? UITextField {
И это было исправлением:
let searchField = searchController.searchBar.searchTextField
Это все еще работает для меня с ключом "searchField" без подчеркивания. Swift 5
guard let searchField = searchBar.value(forKey: "searchField") as? UITextField else { return }
Если хотите, проверьте версию iOS!
if #available(iOS 13.0, *) {
searchBar.searchTextField.clearButtonMode = .never
} else {
searchBar.textField.clearButtonMode = .never
}
Не забывайте расширение:
extension UISearchBar {
var textField : UITextField{
return self.value(forKey: "_searchField") as! UITextField
}
}
Если мы хотим поддерживать iOS 12 и более ранние версии также во время компиляции с Xcode 11, то мы можем сделать расширение UISearchBar
, где мы можем получить текстовое поле
extension UISearchBar {
var textField : UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
} else {
// Fallback on earlier versions
for view : UIView in (self.subviews[0]).subviews {
if let textField = view as? UITextField {
return textField
}
}
}
return nil
}
}
ИСПОЛЬЗОВАНИЕ
searchBar.textField?.font = UIFont.systemFont(ofSize: 15.0)
Здесь мы можем получить доступ ко всем свойствам textField и изменить их в соответствии с нашими потребностями в UISearchBar
Произошло изменение в иерархии представлений.
Так, печатая self.subviews[0]).subviews
, где self
в UISearchBar
Для iOS 12 и более ранних версий
Для iOS 13+
Наряду с UISearchBarBackground
, теперь у нас есть UISearchBarSearchContainerView
и UISearchBarScopeContainerView
, тогда как UISearchBarTextField
отсутствует, что заменено расширением, предоставленным Apple в классе UISearchTextField
extension UISearchBar {
open var searchTextField: UISearchTextField { get }
}
Таким образом, мы можем получить прямой доступ к searchBar.searchTextField
на устройствах iOS 13 и выше, тогда как это приведет к падению, если мы попытаемся получить доступ к этому свойству на устройствах iOS 12 и ниже.
Авария будет такой:
[UISearchBar searchTextField]: нераспознанный селектор отправлен на экземпляр
Вот Apple документ для этого
extension UISearchBar {
var textField : UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
} else {
// Fallback on earlier versions
return value(forKey: "_searchField") as? UITextField
}
return nil
}
}
Вы можете сделать такую проверку для iOS 11 и более ранних версий:
if #available(iOS 11, *){
self.searchBar.placeholder = "Search by Name"
self.searchBar.setSerchFont(textFont: UIFont(name:AppFontLato.Regular, size:14.0 * DeviceInfo.aspectRatio()))
self.searchBar.setSerchTextcolor(color: Colors.black51)
}
else{
if let searchTextField = self.searchBar.value(forKey: "_searchField") as? UITextField, let clearButton = searchTextField.value(forKey: "_clearButton") as? UIButton {
searchTextField.placeholder = "Search by Name"
searchTextField.font = UIFont(name:AppFontLato.Regular, size:14.0 * DeviceInfo.aspectRatio())
searchTextField.textColor = Colors.black51
}
}
Надеюсь, это поможет