swift - 在 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 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
}
}
推荐阅读
- javascript - Angular 10 中的范围滑块不适用于十进制值
- datagrid - 设置文本列过滤器以进行完全匹配检查,而不是“包含”
- android - recyclerview 中的媒体播放器同时播放
- unit-testing - 在 Go 中记录单元测试
- python - 你能改进代码 - 3D 数组中的迭代吗?
- powerbi - SSAS 表格/PowerBI 混合分区
- excel-formula - 如何在从文本中提取日期时从范围中计数(即将执行的任务数)
- flutter - Fonts 2.1.0 and audio player 0.10.0 not working
- formsflow.ai - 提交表单时显示“提交无法完成”
- java - 如何在 Minecraft 中制作自定义操作命令