web-dev-qa-db-ja.com

iOS 13-UISearchBar _searchFieldを使用したカスタム検索バーが機能しない

Xcode-11-Beta(ios13)の前の、textFieldを正常に機能させるためのキーのカスタム検索バー値のコード。クラッシュログを下に取得しています。

'NSGenericException'、理由: 'UISearchBarの_searchField ivarへのアクセスは禁止されています。これはアプリケーションのバグです '

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

助けてくれてありがとう。

37
Pratik Sodha

SDKは UISearchBar.searchTextField プライベートAPI実装をパブリックAPIに置き換えるだけです。

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

IOS 13を指定すると、同じ値のクラッシュが発生しました。value(forKey :)はもう必要ありません。

クラッシュの原因となった行は次のとおりです。

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

そしてこれは修正でした:

let searchField = searchController.searchBar.searchTextField
17

Xcode 11でコンパイルしながらiOS 12以前をサポートしたい場合は、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を出力することにより、selfUISearchBar


iOS 12以前

enter image description here

iOS 13+の場合

enter image description here

UISearchBarBackgroundに加えて、UISearchBarSearchContainerViewUISearchBarScopeContainerViewがありますが、UISearchBarTextFieldがありませんが、UISearchTextFieldクラスのAppleによって提供される拡張機能に置き換えられています

extension UISearchBar {


    open var searchTextField: UISearchTextField { get }
}

そのため、iOS 13以降のデバイスではsearchBar.searchTextFieldに直接アクセスできますが、iOS 12以下のOSデバイスでこのプロパティにアクセスしようとするとクラッシュします。

クラッシュは次のようになります。

[UISearchBar searchTextField]:認識されないセレクターがインスタンスに送信されました

enter image description here

これがApple doc です。

15

それでも、アンダースコアなしでキー「searchField」を使用しても機能します。 Swift 5

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

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

すべての場所で "_"アンダースコアを削除し(プロパティにアクセスしようとしているとき)、すべての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

これを行う:

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

これにより、バージョンチェックに基づいて検索バーのテキストフィールドが適切に表示されます。

0
Tejas

あなたはこの答えを使うことができ、iOS 13でうまく動作します:-

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

0
Vipul Kumar

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

お役に立てれば

0
Sarabjit Singh

キーのキャンセルボタンの値でクラッシュします。 iOS 13 . でキャンセルボタンをカスタマイズすることは可能ですか?enter image description here

0
Manikandan