#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. Спасибо всем вам за вашу помощь! Я последовал вашему совету и убрал ярлыки из стека, а стек сделал ленивым. В конце концов это сработало для меня, хотя я надеялся, что у меня будет более простой способ доступа к ярлыкам, которые находились внутри стопки.