Xcode-11-Beta(ios13)の前の、textFieldを正常に機能させるためのキーのカスタム検索バー値のコード。クラッシュログを下に取得しています。
'NSGenericException'、理由: 'UISearchBarの_searchField ivarへのアクセスは禁止されています。これはアプリケーションのバグです '
- (UITextField *)textField
{
return [self valueForKey:@"_searchField"];
}
助けてくれてありがとう。
SDKは UISearchBar.searchTextField
プライベートAPI実装をパブリックAPIに置き換えるだけです。
searchBar.searchTextField.backgroundColor = [UIColor blueColor];
IOS 13を指定すると、同じ値のクラッシュが発生しました。value(forKey :)はもう必要ありません。
クラッシュの原因となった行は次のとおりです。
if let searchField = searchController.searchBar.value(forKey: "_searchField") as? UITextField {
そしてこれは修正でした:
let searchField = searchController.searchBar.searchTextField
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
を出力することにより、self
のUISearchBar
iOS 12以前
iOS 13+の場合
UISearchBarBackground
に加えて、UISearchBarSearchContainerView
とUISearchBarScopeContainerView
がありますが、UISearchBarTextField
がありませんが、UISearchTextField
クラスのAppleによって提供される拡張機能に置き換えられています
extension UISearchBar {
open var searchTextField: UISearchTextField { get }
}
そのため、iOS 13以降のデバイスではsearchBar.searchTextField
に直接アクセスできますが、iOS 12以下のOSデバイスでこのプロパティにアクセスしようとするとクラッシュします。
クラッシュは次のようになります。
[UISearchBar searchTextField]:認識されないセレクターがインスタンスに送信されました
これがApple doc です。
それでも、アンダースコアなしでキー「searchField」を使用しても機能します。 Swift 5
guard let searchField = searchBar.value(forKey: "searchField") as? UITextField else { return }
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
}
}
すべての場所で "_"アンダースコアを削除し(プロパティにアクセスしようとしているとき)、すべての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
}
}
これを行う:
var searchTextField: UITextField?
if #available(iOS 13.0, *) {
searchTextField = searchBar.searchTextField
} else {
if let searchField = searchBar.value(forKey: "searchField") as? UITextField {
searchTextField = searchField
}
}
これにより、バージョンチェックに基づいて検索バーのテキストフィールドが適切に表示されます。
あなたはこの答えを使うことができ、iOS 13でうまく動作します:-
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
}
}
お役に立てれば
キーのキャンセルボタンの値でクラッシュします。 iOS 13 . でキャンセルボタンをカスタマイズすることは可能ですか?