webentwicklung-frage-antwort-db.com.de

ios 13 - Benutzerdefinierte Suchleiste mit UISearchBar _searchField funktioniert nicht

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.

37
Pratik Sodha

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];
68
Jordan H

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
17

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

enter image description here

Für iOS 13 +

enter image description here

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

enter image description here

Hier ist das Apple doc dafür

15

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

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

Der Unterstrich "_" (beim Versuch, auf die Eigenschaft zuzugreifen) wurde überall entfernt und funktionierte für alle iOS-Versionen.

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

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.

0
Tejas

Sie können diese Antwort verwenden und funktionieren in iOS 13 einwandfrei: -

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

0
Vipul Kumar

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

0
Sarabjit Singh

Ich erhalte einen Absturz beim Abbrechen des Tastenwerts für den Schlüssel. Ist es möglich, die Abbrechen-Schaltfläche in iOS 13 anzupassen? enter image description here

0
Manikandan