5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

はじめに

今まで UISearchBar のテキストフィールドをカスタマイズしたい場合は下記のようにアクセスする方法が主流でした。

let textField = searchBar.value(forKey: "_searchField") as? UITextField

しかし、iOS13 では実行すると下記のようなエラーとなりアプリがクラッシュします:scream:

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

:scream::scream::scream:

対応

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 でアクセスできるようになりました:tada::tada::tada:

その他UISearchBarの新機能

iOS13 からは下記のクラスが追加されており色々新機能があるようです。

UISearchTextFieldDelegate というプロトコルも追加されているみたいです。

下記の記事に詳しく書いてありました。

UISearchToken がおもしろそう

さいごに

UISearchBarvalue(forKey: "_searchField") という非合法のやり方でテキストフィールドにアクセスする Developer があまりにも多いので公式で API を用意してくれたんですかね?

This is an application bug

というくらいですからお前らもう公式で用意したからそういうことやめろよ?って感じがします:sweat_smile:

余談ですが UIAlertController も下記のように色々カスタマイズできます。

UIAlertAction の setValue(_:forKey:) で下記のようにキーを指定すると色々できるようです。(参考)

  • image
  • imageTintColor
  • titleTextColor

他にも色々いじれそう...(参考)

こんな感じ

alert

UIAlertController のカスタマイズもみんなが使いまくれば公式 API が公開されるかも?:hatching_chick:

参考

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?