最近,我正在一个我的项目中,我希望拥有多个标签,这些标签具有相同的字体,文本颜色和属性,但文本除外。
这是我编写的代码:
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的计算属性。但是没有做好。您的个人资料标签应已定义如下。
var profileLabel: UILabel {
get {
let label = UILabel()
label.font = .displayNameLabel
label.textColor = .profileLabel
label.numberOfLines = .numberOfLines
label.textAlignment = .center
label.translatesAutoresizingMaskIntoConstraints = false
return label
}
}
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()
顺便说一句,font
和textColor
中的那些枚举在做什么?