在 Swift 中以编程方式访问和更新 stackview 中的 label.text 或其他 UILabel 属性
Posted
技术标签:
【中文标题】在 Swift 中以编程方式访问和更新 stackview 中的 label.text 或其他 UILabel 属性【英文标题】:Access and update label.text or other UILabel properties inside a stackview programatically in Swift 【发布时间】:2021-11-09 11:57:34 【问题描述】:我在 Swift 中以编程方式创建了一个带有标签的堆栈视图。但是,我试图找出如何以编程方式更新标签? (我没有使用故事板或 IBOutlets)
let LabelStack: UIStackView =
let label1: UILabel =
let label = UILabel()
label.text = "Label 1"
label.font = .systemFont(ofSize: 14, weight: .bold)
label.numberOfLines = 0
label.backgroundColor = .clear
label.textAlignment = .left
label.sizeToFit()
return label
()
let label2: UILabel =
let label = UILabel()
label.text = "Label 2"
label.font = .systemFont(ofSize: 14, weight: .bold)
label.numberOfLines = 0
label.backgroundColor = .clear
label.textAlignment = .left
label.sizeToFit()
return label
()
let stack = UIStackView(arrangedSubviews: [label1, label2])
stack.distribution = .equalSpacing
stack.spacing = 4.0
return stack
()
尝试使用函数更新标签文本时,我不确定如何访问标签属性以进行此更改。通常,对于在堆栈之外创建的标签,我可以简单地使用:
func updateLabel()
label1.text = "Updated Label 1 text"
label2.text = "Updated Label 2 text"
使用标签访问位于 UIStackview 中的这些标签属性的语法是什么?
【问题讨论】:
把label1
和label2
放在LabelStack
外面,和LabelStack
同级。我会将LabelStack
重命名为labelStack
(以lwoercase 开头)
为什么要在里面创建它们?
【参考方案1】:
你可以在外面let labelStack: UIStackView =
let label1: UILabel =
let label = UILabel()
label.text = "Label 1"
label.font = .systemFont(ofSize: 14, weight: .bold)
label.numberOfLines = 0
label.backgroundColor = .clear
label.textAlignment = .left
label.sizeToFit()
return label
()
let label2: UILabel =
let label = UILabel()
label.text = "Label 2"
label.font = .systemFont(ofSize: 14, weight: .bold)
label.numberOfLines = 0
label.backgroundColor = .clear
label.textAlignment = .left
label.sizeToFit()
return label
()
let labelStack: UIStackView =
let stack = UIStackView(arrangedSubviews: [label1, label2])
stack.distribution = .equalSpacing
stack.spacing = 4.0
return stack
()
或者这样做
if let label1 = labelStack.arrangedSubviews.first as? UILabel
// proceed
if let label2 = labelStack.arrangedSubviews.last as? UILabel
// proceed
【讨论】:
除非它在函数内部,否则它将无法工作,因为 labelStack 无法找到 label1 和 2【参考方案2】:您可以在外部创建它们。但这需要您稍后添加排列的子视图,因为它尚未初始化。所以你可以让 stackView Lazy 等待 init 运行:
let label1: UILabel =
let label = UILabel()
label.text = "Label 1"
label.font = .systemFont(ofSize: 14, weight: .bold)
label.numberOfLines = 0
label.backgroundColor = .clear
label.textAlignment = .left
label.sizeToFit()
return label
()
let label2: UILabel =
let label = UILabel()
label.text = "Label 2"
label.font = .systemFont(ofSize: 14, weight: .bold)
label.numberOfLines = 0
label.backgroundColor = .clear
label.textAlignment = .left
label.sizeToFit()
return label
()
lazy var labelStack: UIStackView =
let stack = UIStackView(arrangedSubviews: [label1, label2])
stack.distribution = .equalSpacing
stack.spacing = 4
return stack
()
如果您必须静态标记和 2 个文本,您可以这样做:
zip(labelStack.arrangedSubviews, ["textupdate1", "textupdate2"]).forEach (element value) in
(element as? UILabel)?.text = value
【讨论】:
谢谢大家的帮助!我听从了您的建议,将标签移出堆栈,并使堆栈惰性 var。这最终对我有用,即使我希望有一种更简单的方法来访问堆栈内的标签。以上是关于在 Swift 中以编程方式访问和更新 stackview 中的 label.text 或其他 UILabel 属性的主要内容,如果未能解决你的问题,请参考以下文章
使用 Cocoa 在 Swift 4.0 中以编程方式创建复选框的标准方法是啥?
在Swift 3中以编程方式创建一个没有XIB的NSViewController