Swift:通过 ID 获取 UI 对象?

Posted

技术标签:

【中文标题】Swift:通过 ID 获取 UI 对象?【英文标题】:Swift: get UI objects by ID? 【发布时间】:2016-06-16 03:40:35 【问题描述】:

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

我正在寻找类似于 androidfindViewById(id)

【问题讨论】:

【参考方案1】:

您可以使用viewWithTag,但标签类型为Int

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

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


【讨论】:

谢谢!我只是希望可以指定一个字符串! 为什么无法通过 Storyboard 标签或恢复 ID 检索 UI 对象? @DanieleB 因为标签是Int 类型如果你想绑定 obj 到 obj 你可以使用运行时来做 @DanieleB 从xibstoryboard 获取用户界面的最佳方式是使用@IBOutlet 是的,我知道,但在我的特殊情况下,我有 11 个自定义视图放在情节提要上,我想用 ID 检索它们,而不是作为 @IBOutlets 导入它们【参考方案2】:

由于您在情节提要中有多个 viewController,您可能正在寻找 UIStoryboards storyboard.instantiateViewControllerWithIdentifier(identifier: String)

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

【讨论】:

实际上,我在同一个视图控制器中有几个自定义视图 啊,明白了。任何事情都是可能的,例如,您可以通过让您的 customViews 实现可识别的协议来摆脱困境。话虽如此,我相信遵循标准模式是有意义的,并且在情节提要中操纵视图通常通过 IBOutlets 完成。 (或者你可以使用上面建议的标签)。【参考方案3】:

我需要跨多个 UITableViewController 与 UIButton 共享一个 UITableViewCell 后代。所以 IBOutlet 不是我的选择,我需要类似于 Android findByViewId 的东西

所以我在配置时在 UITableViewCell 后代中做到了:

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

如果您有更复杂的单元格布局,我认为您可以使用一些特定的视图属性来识别所需的子视图。

附:根据我的经验,将 Tag 属性用于此类目的通常不是一个好主意。

【讨论】:

以上是关于Swift:通过 ID 获取 UI 对象?的主要内容,如果未能解决你的问题,请参考以下文章

Swift UI 获取 JSON

在 Swift 中,如何从 UITableView 中获取对象 id 并根据对象 id 删除对象?

如何在 Firestore (iOS) 中获取对象

Swift Firebase 获取数据到类对象

如何在 Xcode 中获取 UI 对象

在获取永久 ID 后,核心数据无法为对象完成故障