在 UIView 闭包中将变量设置为已定义的惰性变量会导致引用问题
Setting a variable to a defined lazy var within a UIView closure cause reference problems
最近,我在做我的一个项目,我想要多个标签具有相同的字体、文本颜色和属性,除了它们的文本。
这是我写的代码:
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 profileLabel
更改为 var profileLabel
会解决此问题并在每次调用 profileLabel
时创建一个具有所需属性的新标签吗?
您打算使用 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
}
}
最近,我在做我的一个项目,我想要多个标签具有相同的字体、文本颜色和属性,除了它们的文本。
这是我写的代码:
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 profileLabel
更改为 var profileLabel
会解决此问题并在每次调用 profileLabel
时创建一个具有所需属性的新标签吗?
您打算使用 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
}
}