首页 > 解决方案 > 在 UIView 闭包中将变量设置为定义的惰性变量会导致引用问题

问题描述

最近,我正在处理我的一个项目,我希望拥有多个具有相同字体、文本颜色和属性的标签,除了它们的文本。

这是我写的代码:

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.

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

标签: swiftuiviewlazy-initialization

解决方案


您打算使用 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
   }
}

推荐阅读