はじめに
今まで UISearchBar のテキストフィールドをカスタマイズしたい場合は下記のようにアクセスする方法が主流でした。
let textField = searchBar.value(forKey: "_searchField") as? UITextField
しかし、iOS13 では実行すると下記のようなエラーとなりアプリがクラッシュします![]()
Terminating app due to uncaught exception 'NSGenericException', reason: 'Access to UISearchBar's _searchField ivar is prohibited. This is an application bug'
This is an application bug
![]()
![]()
![]()
対応
iOS13 からは searchTextField というプロパティが追加されたようです。
こちらは UISearchTextField というクラスのようですが UITextField を継承しているので今まで通りテキストフィールドとして利用できます。
iOS13 以前では今まで通り value(forKey: "_searchField") でアクセスしないといけないので下記のような extension を作ると使いやすいと思います。
extension UISearchBar {
var textField: UITextField {
if #available(iOS 13.0, *) {
return searchTextField
} else {
return value(forKey: "_searchField") as! UITextField
}
}
}
これでどの画面でも searchBar.textField でアクセスできるようになりました![]()
![]()
![]()
その他UISearchBarの新機能
iOS13 からは下記のクラスが追加されており色々新機能があるようです。
UISearchTextFieldDelegate というプロトコルも追加されているみたいです。
下記の記事に詳しく書いてありました。
UISearchToken がおもしろそう
さいごに
UISearchBar は value(forKey: "_searchField") という非合法のやり方でテキストフィールドにアクセスする Developer があまりにも多いので公式で API を用意してくれたんですかね?
This is an application bug
というくらいですからお前らもう公式で用意したからそういうことやめろよ?って感じがします![]()
余談ですが UIAlertController も下記のように色々カスタマイズできます。
UIAlertAction の setValue(_:forKey:) で下記のようにキーを指定すると色々できるようです。(参考)
- image
- imageTintColor
- titleTextColor
他にも色々いじれそう...(参考)
こんな感じ
UIAlertController のカスタマイズもみんなが使いまくれば公式 API が公開されるかも?![]()