Доступ и обновление label.text или других свойств UILabel внутри stackview программно в Swift

#swift #xcode #uilabel #uistackview

Вопрос:

Я создал представление стека с метками программно в 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 с помощью меток?

Комментарии:

1. Сделайте label1 и label2 снаружи LabelStack , поставьте их на один и тот же уровень LabelStack . И я бы переименовал LabelStack с labelStack (начиная с нижнего регистра)

2. Почему вы хотите создать их внутри?

Ответ №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 }  

Комментарии:

1. если это не находится внутри функции, она не будет работать, так как labelStack не сможет найти метки 1 и 2

Ответ №2:

Вы можете создавать их снаружи. Но для этого вам потребуется добавить arrangedSubviews позже, так как он еще не был инициализирован. Таким образом, вы можете сделать StackView ленивым, который ожидает запуска инициализации:

 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  }  

Комментарии:

1. Спасибо всем вам за вашу помощь! Я последовал вашему совету и убрал ярлыки из стека, а стек сделал ленивым. В конце концов это сработало для меня, хотя я надеялся, что у меня будет более простой способ доступа к ярлыкам, которые находились внутри стопки.