iOSでは、文字列IDをUIオブジェクトに割り当てて、そのIDでコード内でそれらを取得することは可能ですか?
AndroidのfindViewById(id)
に似たものを探しています
viewWithTag
を使用できますが、タグはInt
のタイプです。
let superView = UIView()
let subView = UIView()
subView.tag = 100
superView.addSubview(subView)
let v = superView.viewWithTag(100)
xib
またはstoryboard
を使用する場合、次のようにidをバインドできます。
ランタイムを使用すると、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
}
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プロパティを使用した私の経験から、一般的には良い考えではありません。
ストーリーボードに複数のviewControllerがあるので、おそらくUIStoryboard
s storyboard.instantiateViewControllerWithIdentifier(identifier: String)
を探しています。
// Basic example
let viewController = yourStoryboard.instantiateViewControllerWithIdentifier("id") as! UIViewController