Swift: получить объекты пользовательского интерфейса по идентификатору?

В iOS можно ли присвоить строковый идентификатор объектам пользовательского интерфейса, а затем извлечь их в коде по этому идентификатору?

Я ищу что-то похожее на Android findViewById(id)

3 ответа

Решение

Ты можешь использовать viewWithTag но тег это тип Int:

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

если использовать xib или же storyboard Вы можете привязать идентификатор так:

используйте runtime, вы можете привязать 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

}

Поскольку у вас есть несколько viewControllers в раскадровке, вы, вероятно, ищете UIStoryboards storyboard.instantiateViewControllerWithIdentifier(identifier: String)

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

Мне нужно было поделиться одним потомком UITableViewCell с UIButton для нескольких UITableViewControllers. Поэтому IBOutlet не был для меня вариантом, и мне нужно было что-то похожее на Android findByViewId

Поэтому я сделал это в потомке UITableViewCell при настройке:

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

Если у вас более сложное расположение ячеек, я думаю, что вы можете использовать некоторые специфические свойства представления для определения необходимого подпредставления.

PS из моего опыта использования свойства Tag для таких целей, как правило, не очень хорошая идея.

Другие вопросы по тегам