Swift
Subview

【iOS】UIKit Frameworkのクラスのsubviewを調べて取得する方法

More than 1 year has passed since last update.

例)UISearchBar

subviewから取得する

UISearchBarのsubviewはUIViewですが、そのsubviewにはImageViewとTextFieldのクラスがあります。

for subview in searchBar.subviews {
    for subview2 in subview.subviews {
        print(subview2)
    }    
}

[コンソールの出力]
SearchBarSubview.png

クラス名は、
UISearchBarBackground -> ImageView
UISearchBarTextField -> TextField

となります。

UISearchBarTextField等は、通常時に利用できるクラスではないので、

if subview2.isKind(of: UITextField.self) {

}

のように取得はできません。

そのためNSClassFromStringを利用して、取得します。
以下の2種類の方法はどちらでも取得できます。

for subview in searchBar.subviews {
    for subview2 in subview.subviews {
        print(subview2)
        if subview2.isKind(of: NSClassFromString("UISearchBarBackground")!) {

        }
    }    
}
for subview in searchBar.subviews {
    for subview2 in subview.subviews {
        print(subview2)
        if NSStringFromClass(type(of: subview2)) == "UISearchBarBackground" {

        }
    }    
}

あとは、キャストして利用するだけです。

if subview2.isKind(of: NSClassFromString("UISearchBarTextField")!) {
    let textField = subview2 as! UITextField
    textField.backgroundColor = UIColor.blue
}

value(forKey: )を利用して取得する

同様にpropertyで設定されていればvalue(forKey: )を利用して取得することもできます。

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

textField.backgroundColor = UIColor.blue

どちらの方法でも特に問題ありません。