Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
15
Help us understand the problem. What is going on with this article?
@ktanaka117

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

More than 1 year has passed since last update.

「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
        }
    }
}

参考

15
Help us understand the problem. What is going on with this article?
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
ktanaka117
百合好きのダンボールの人です。 SwiftでiOSアプリを開発していて、最近のホットトピックはテスト、設計、リファクタリング。 Twitter: @ktanaka117

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
15
Help us understand the problem. What is going on with this article?