访问Swift中存储闭包的属性

时间:2017-02-12 15:37:19

标签: ios swift

假设我有一个属性,它包含一个类似于此类中的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成员,这是真的。有没有办法真正改变上面声明的闭包的标签文本?

2 个答案:

答案 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