web-dev-qa-db-fra.com

ios 13 - La barre de recherche personnalisée avec UISearchBar _searchField ne fonctionne pas

Avant Xcode-11-Beta (ios13) sous le code pour la valeur de la barre de recherche personnalisée pour la clé pour que textField fonctionne correctement. Maintenant en dessous du journal des plantages.

'NSGenericException', raison: 'L'accès à l'ivar _searchField d'UISearchBar est interdit. C'est un bug d'application'

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

Toute aide appréciée.

37
Pratik Sodha

Le SDK fournit désormais UISearchBar.searchTextField pour que vous puissiez simplement remplacer votre implémentation d'API privée par l'API publique.

searchBar.searchTextField.backgroundColor = [UIColor blueColor];
68
Jordan H

J'ai eu le même crash, avec IOS 13 vous n'avez plus besoin du .value (forKey :)

Voici la ligne qui a provoqué le crash:

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

Et c'était la solution:

let searchField = searchController.searchBar.searchTextField
17
Daniel Ardeleanu

Si nous voulons prendre en charge iOS 12 et les versions antérieures également lors de la compilation avec Xcode 11, nous pouvons créer une extension de UISearchBar où nous pouvons saisir le champ de texte

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

USAGE

searchBar.textField?.font = UIFont.systemFont(ofSize: 15.0)

Ici, nous pouvons accéder à toutes les propriétés de textField et les modifier selon nos besoins dans UISearchBar

Il y a un changement dans la hiérarchie des vues. Donc en imprimant self.subviews[0]).subviewsself dans UISearchBar


Pour iOS 12 et versions antérieures

enter image description here

Pour iOS 13 +

enter image description here

Avec UISearchBarBackground, nous avons maintenant UISearchBarSearchContainerView et UISearchBarScopeContainerView alors que UISearchBarTextField est manquant et est remplacé par une extension fournie par Apple dans Classe UISearchTextField

extension UISearchBar {


    open var searchTextField: UISearchTextField { get }
}

Nous pouvons donc accéder directement à searchBar.searchTextField Dans les appareils iOS 13 et supérieurs, tandis que cela entraînera un plantage si nous essayons d'accéder à cette propriété dans les appareils iOS 12 et inférieurs.

Le crash sera comme ceci:

[UISearchBar searchTextField]: sélecteur non reconnu envoyé à l'instance

enter image description here

Voici le Apple doc pour cela

15
Rajan Maheshwari

Cela fonctionne toujours pour moi avec la clé "searchField" sans souligné. Swift 5

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

Si vous voulez vérifier la version iOS!

 if #available(iOS 13.0, *) {
    searchBar.searchTextField.clearButtonMode = .never
 } else {
    searchBar.textField.clearButtonMode = .never
 }

N'oubliez pas l'extension:

extension UISearchBar {

 var textField : UITextField{
    return self.value(forKey: "_searchField") as! UITextField
 }
}
3
irvinstone

Suppression du trait de soulignement "_" (en essayant d'accéder à la propriété) partout et cela a fonctionné pour toutes les versions d'iOS.

3
mohsin
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
    }
}
2
midhun p

Faites ceci:

 var searchTextField: UITextField?
    if #available(iOS 13.0, *) {
        searchTextField = searchBar.searchTextField
    } else {
        if let searchField = searchBar.value(forKey: "searchField") as? UITextField {
            searchTextField = searchField
        }
    }

Cela vous donnera le champ de texte de la barre de recherche en fonction de la vérification de la version.

0
Tejas

Vous pouvez utiliser cette réponse, fonctionnant très bien dans iOS 13: -

https://stackoverflow.com/a/60503506/9863222

0
Vipul Kumar

Vous pouvez effectuer une vérification comme celle-ci pour iOS 11 et les versions antérieures:

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

J'espère que cela t'aides

0
Sarabjit Singh

Je reçois un crash sur la valeur du bouton Annuler forkey. Est-il possible de personnaliser le bouton d'annulation dans iOS 13 . enter image description here

0
Manikandan