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 в раскадровке, вы, вероятно, ищете UIStoryboard
s 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 для таких целей, как правило, не очень хорошая идея.