Swift:通过ID获取UI对象?

时间:2016-06-16 03:40:36

标签: swift tags findviewbyid state-restoration

在iOS中,是否可以为UI对象分配字符串ID,然后通过该ID在代码中检索它们?

我正在寻找类似Android的string colors = ""; StringBuilder sb = new StringBuilder(); foreach (var currentItem in lbOwner.SelectedItems) { sb.Append(currentItem + ", "); } colors = sb.ToString();

3 个答案:

答案 0 :(得分:9)

您可以使用viewWithTag,但代码的类型为Int

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

如果使用xibstoryboard,您可以像这样绑定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

}

答案 1 :(得分:0)

由于您在故事板中有多个viewControllers,您可能正在寻找UIStoryboard s storyboard.instantiateViewControllerWithIdentifier(identifier: String)

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

答案 2 :(得分:0)

我需要跨多个UITableViewControllers与UIButton共享一个UITableViewCell后代。所以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属性进行此类目的的经验通常不是一个好主意。