在UIView闭包内将变量设置为已定义的惰性变量会导致引用问题

问题描述 投票:0回答:2

最近,我正在一个我的项目中,我希望拥有多个标签,这些标签具有相同的字体,文本颜色和属性,但文本除外。

这是我编写的代码:

lazy var profileLabel: UILabel = {
    let label = UILabel()
    label.font = .displayNameLabel
    label.textColor = .profileLabel
    label.numberOfLines = .numberOfLines
    label.textAlignment = .center
    label.translatesAutoresizingMaskIntoConstraints = false

    return label
}()

lazy var displayName: UILabel = {
    let label = profileLabel
    label.text = "Kevin"

    return label
}()

lazy var countryLabel: UILabel = {
    let label = profileLabel
    label.text = "US"

    return label
}()

如您所见,为解决我的问题,我创建了一个标签,该标签具有我所有其他标签所需的所有属性。对于其他标签,我以为我要通过输入let label = profileLabel创建一个新标签。但事实证明,事实并非如此。在连续调用设置文本并将标签添加到我的视图之后,实际上只显示了1个标签,它是最后添加的标签;因此在这种情况下,它将是countryLabel

在我看来,在所有让label = profileLabel的呼叫中,我只是创建对同一profileLabel的引用。如果是这种情况,将lazy var profileLabel更改为var profileLabel是否可以解决此问题,并在每次调用profileLabel时创建具有所需属性的新标签?

swift uiview lazy-initialization
2个回答
1
投票

您打算使用swift的计算属性。但是没有做好。您的个人资料标签应已定义如下。

var profileLabel: UILabel {
   get {
      let label = UILabel()
      label.font = .displayNameLabel
      label.textColor = .profileLabel
      label.numberOfLines = .numberOfLines
      label.textAlignment = .center
      label.translatesAutoresizingMaskIntoConstraints = false
      return label
   }
}

0
投票

UILabel是Swift中的class,默认情况下,类是通过引用调用。因此,所有标签最终都指向profileLabel

您需要有一个返回新实例UILabel的方法。

func getCustomLabel() -> UILabel {
    let label = UILabel()
    // Set common label properties
    return label
}

如果名称和国家/地区是硬编码的,则可以在闭包内部调用getCustomLabel的方法,您现在可以在其中调用UILabel()的方法。但是,我不认为这是一个实际的用例,因此我会这样做,并在稍后设置文本。

lazy var displayName: UILabel = getCustomLabel()

lazy var countryLabel: UILabel = getCustomLabel()

顺便说一句,fonttextColor中的那些枚举在做什么?

© www.soinside.com 2019 - 2024. All rights reserved.