假设我有一个属性,它包含一个类似于此类中的UIView实例:
class MyViewController: UIViewController {
var myView: UIView = {
let view = UIView()
let label = UILabel()
view.addSubview(label)
return view
}()
}
有什么办法可以从视图控制器访问其label
属性吗?
class MyViewController: UIViewController {
// myView declaration goes here
func changeLabel() {
myView.label.text = "Help!"
}
}
编译器告诉我UIView
没有label
成员,这是真的。有没有办法真正改变上面声明的闭包的标签文本?
答案 0 :(得分:2)
如果您的视图只有一个子视图,例如您正在使用的示例中的视图,则使用subviews
属性很容易实现。这将返回一个UIView
数组(在这种情况下,它只有一个元素),您可以在那里找到您的标签并更改文本。
如果您的视图更复杂且有多个子视图,这可能会变得更加棘手,因为您必须遍历子视图数组并获取相应的视图。这将导致标签的使用,并且可能不是复杂情况的最佳解决方案。
另一种解决方案是创建UIView
的简单子类,在其中添加一个类似于addLabel
的方法,并在属性中保存对该标签的引用。之后您可以轻松访问它。
答案 1 :(得分:2)
是的,你可以!
首先,您的第一个代码段无法编译,应更改为:
var myView: UIView = {
let view = UIView()
let label = UILabel()
view.addSubview(label)
return view
}() // <- add these parentheses
现在,要访问label
,我们需要为标签tag
,所以这样做:
var myView: UIView = {
let view = UIView()
let label = UILabel()
label.tag = 1
view.addSubview(label)
return view
}()
现在您可以像这样访问VC中的标签:
let label = myView.viewWithTag(1) as! UILabel