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


参考