在 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 中的这些标签属性的语法是什么?

【问题讨论】:

label1label2放在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

在 Swift 中以编程方式居中按钮

如何在Swift中以编程方式从另一个图像中剪切徽标的形状(png图像)?

UIScrollView 在 Swift 中以编程方式

在 Swift 中以编程方式更改 UIButton 的文本(填充)