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.
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];
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
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]).subviews
Où self
dans UISearchBar
Pour iOS 12 et versions antérieures
Pour iOS 13 +
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
Voici le Apple doc pour cela
Cela fonctionne toujours pour moi avec la clé "searchField" sans souligné. Swift 5
guard let searchField = searchBar.value(forKey: "searchField") as? UITextField else { return }
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
}
}
Suppression du trait de soulignement "_" (en essayant d'accéder à la propriété) partout et cela a fonctionné pour toutes les versions d'iOS.
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
}
}
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.
Vous pouvez utiliser cette réponse, fonctionnant très bien dans iOS 13: -
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