ios 13 - Пользовательская панель поиска с UISearchBar _searchField не работает

Перед Xcode-11-Beta (ios13) ниже приведен код для настраиваемого значения панели поиска для ключа, чтобы textField работал нормально. Теперь получаю журнал аварий ниже.

"NSGenericException", причина: "Доступ к UISearchBar _searchField ivar запрещен. Это ошибка приложения

- (UITextField *)textField
{
 return [self valueForKey:@"_searchField"];
}

Любая помощь приветствуется.

Ответ 1

SDK теперь предоставляет UISearchBar.searchTextField, так что вы можете просто заменить свою реализацию частного API на публичный API.

searchBar.searchTextField.backgroundColor = [UIColor blueColor];

Ответ 2

У меня был тот же сбой, с IOS 13 вам больше не нужно .value(forKey :)

Вот строка, которая вызвала сбой:

if let searchField = searchController.searchBar.value(forKey: "_searchField") as? UITextField {

И это было исправлением:

let searchField = searchController.searchBar.searchTextField

Ответ 3

Это все еще работает для меня с ключом "searchField" без подчеркивания. Swift 5

guard let searchField = searchBar.value(forKey: "searchField") as? UITextField else { return }

Ответ 4

Если хотите, проверьте версию 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
 }
}

Ответ 5

Если мы хотим поддерживать 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 и более ранних версий

enter image description here

Для iOS 13+

enter image description here

Наряду с UISearchBarBackground, теперь у нас есть UISearchBarSearchContainerView и UISearchBarScopeContainerView, тогда как UISearchBarTextField отсутствует, что заменено расширением, предоставленным Apple в классе UISearchTextField

extension UISearchBar {


    open var searchTextField: UISearchTextField { get }
}

Таким образом, мы можем получить прямой доступ к searchBar.searchTextField на устройствах iOS 13 и выше, тогда как это приведет к падению, если мы попытаемся получить доступ к этому свойству на устройствах iOS 12 и ниже.

Авария будет такой:

[UISearchBar searchTextField]: нераспознанный селектор отправлен на экземпляр

enter image description here

Вот Apple документ для этого

Ответ 6

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
    }
}

Ответ 7

Вы можете сделать такую проверку для 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
            }
        }

Надеюсь, это поможет