15
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

UISearchBarのプライベートなプロパティにアクセスするコードがiOS 13では禁止になったようです

「UISearchBarのプライベートなプロパティにアクセスする」とは

UISearchBartextField に色を設定するために attributedPlaceholder をセットしたいときなど、(UISearchBarに限らないが)公開されていないUI要素などにアクセスするために value(forKey:) を使う方法を使うことがあった。

searchBar.textField?.attributedPlaceholder = placeholder

extension UISearchBar {
    var textField: UITextField? {
        return value(forKey: "_searchField") as? UITextField
    }
}

iOS 13でこの方法を用いると以下のようなエラーがランタイムで発生して、アプリがクラッシュします。
「このアクセスの方法は禁止されており、アプリケーションのバグです」的なことが言われます。

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Access to UISearchBar's _searchField ivar is prohibited. This is an application bug'

iOS 13以降の対応方法

iOS 13以降では searchTextField というプロパティが外部公開されているので、次のように書いて解決させました。

extension UISearchBar {
    var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return searchTextField
        } else {
            return value(forKey: "_searchField") as? UITextField
        }
    }
}

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
15
Help us understand the problem. What are the problem?