はじめに
今まで 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 が公開されるかも?