Vor Xcode-11-Beta (ios13) unten Code für benutzerdefinierten Suchleistenwert für Schlüssel, damit textField einwandfrei funktioniert. Jetzt unter das Absturzprotokoll.
'NSGenericException', Grund: 'Der Zugriff auf _searchField ivar von UISearchBar ist verboten. Dies ist ein Anwendungsfehler. '
- (UITextField *)textField
{
return [self valueForKey:@"_searchField"];
}
Jede Hilfe geschätzt.
Das SDK bietet jetzt UISearchBar.searchTextField
so können Sie einfach Ihre private API-Implementierung durch die öffentliche API ersetzen.
searchBar.searchTextField.backgroundColor = [UIColor blueColor];
Ich hatte den gleichen Absturz, mit IOS 13 brauchst du den .value (forKey :) nicht mehr)
Hier ist die Zeile, die den Absturz verursacht hat:
if let searchField = searchController.searchBar.value(forKey: "_searchField") as? UITextField {
Und das war die Lösung:
let searchField = searchController.searchBar.searchTextField
Wenn wir iOS 12 und früher auch beim Kompilieren mit Xcode 11 unterstützen möchten, können wir eine Erweiterung von UISearchBar
erstellen, in der wir das Textfeld abrufen können
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
}
}
VERWENDUNG
searchBar.textField?.font = UIFont.systemFont(ofSize: 15.0)
Hier können wir auf alle Eigenschaften von textField zugreifen und gemäß unseren Anforderungen in UISearchBar
ändern.
Die Ansichtshierarchie hat sich geändert. Also durch Drucken von self.subviews[0]).subviews
, Wobei self
in UISearchBar
Für iOS 12 und früher
Für iOS 13 +
Zusammen mit UISearchBarBackground
haben wir jetzt UISearchBarSearchContainerView
und UISearchBarScopeContainerView
, während UISearchBarTextField
fehlt, das durch eine Erweiterung ersetzt wird, die von Apple in bereitgestellt wird Klasse UISearchTextField
extension UISearchBar {
open var searchTextField: UISearchTextField { get }
}
Wir können also direkt auf searchBar.searchTextField
In Geräten mit iOS 13 und höher zugreifen, während dies zu einem Absturz führt, wenn wir versuchen, auf diese Eigenschaft in Geräten mit iOS 12 und darunter zuzugreifen.
Der Absturz wird folgendermaßen aussehen:
[UISearchBar searchTextField]: Nicht erkannter Selektor an Instanz gesendet
Hier ist das Apple doc dafür
Es funktioniert immer noch für mich mit dem Schlüssel "searchField" ohne Unterstrich. Swift 5
guard let searchField = searchBar.value(forKey: "searchField") as? UITextField else { return }
Wenn Sie möchten, überprüfen Sie die iOS-Version!
if #available(iOS 13.0, *) {
searchBar.searchTextField.clearButtonMode = .never
} else {
searchBar.textField.clearButtonMode = .never
}
Vergessen Sie nicht die Erweiterung:
extension UISearchBar {
var textField : UITextField{
return self.value(forKey: "_searchField") as! UITextField
}
}
Der Unterstrich "_" (beim Versuch, auf die Eigenschaft zuzugreifen) wurde überall entfernt und funktionierte für alle iOS-Versionen.
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
}
}
Mach das:
var searchTextField: UITextField?
if #available(iOS 13.0, *) {
searchTextField = searchBar.searchTextField
} else {
if let searchField = searchBar.value(forKey: "searchField") as? UITextField {
searchTextField = searchField
}
}
Dadurch erhalten Sie das Textfeld der Suchleiste entsprechend der Versionsprüfung.
Sie können diese Antwort verwenden und funktionieren in iOS 13 einwandfrei: -
Sie können dies für iOS 11 und frühere Versionen wie folgt überprüfen:
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
}
}
Hoffe das hilft