web-dev-qa-db-ja.com

Swift:IDでUIオブジェクトを取得しますか?

iOSでは、文字列IDをUIオブジェクトに割り当てて、そのIDでコード内でそれらを取得することは可能ですか?

AndroidのfindViewById(id)に似たものを探しています

9
Daniele B

viewWithTagを使用できますが、タグはIntのタイプです。

let superView = UIView()
let subView = UIView()
subView.tag = 100
superView.addSubview(subView)
let v = superView.viewWithTag(100)

xibまたはstoryboardを使用する場合、次のようにidをバインドできます。 enter image description here

ランタイムを使用すると、objをobjにバインドできますが、必要ないようです:

objc_setAssociatedObject(superView, "key", subView, .OBJC_ASSOCIATION_RETAIN)
let v = objc_getAssociatedObject(superView, "key")

更新:

列挙型を使用してビューを取得できます:

enum UIKey:String {
    case AA = "aa"


    func findView(byKey:String ,fromView:UIView) -> UIView {
        let v :UIView!

        switch self {
            // get view from real tag value
            case .AA: v = fromView.viewWithTag(1)
        }

        return v
    }
}

次に使用します:

let dict = ["aa":123]

dict.forEach { (key,value) in
    let v = UIKey(rawValue: key)?.findView(key, fromView: self.view)
    //set v with your value

}
9
Wilson XJ

1つのUITableViewCellの子孫を複数のUITableViewController間でUIButtonと共有する必要がありました。そのため、IBOutletは私にとってオプションではなく、Android findByViewIdに似たものが必要でした。

だから私はそれを構成するときにUITableViewCellの子孫でそれをしました:

for view in self.contentView.subviews {
            if let button = view as? UIButton {
                button.setTitle(item.label, for: .normal) 
            }
        }

より複雑なセルレイアウトがある場合は、特定のビュープロパティを使用して、必要なサブビューを特定できると思います。

P.S.このような目的でTagプロパティを使用した私の経験から、一般的には良い考えではありません。

0
engilyin

ストーリーボードに複数のviewControllerがあるので、おそらくUIStoryboards storyboard.instantiateViewControllerWithIdentifier(identifier: String)を探しています。

// Basic example
let viewController = yourStoryboard.instantiateViewControllerWithIdentifier("id") as! UIViewController
0