【问题标题】:UIButton to append array of UIViews to UIStackViewUIButton 将 UIViews 数组附加到 UIStackView
【发布时间】:2022-01-08 21:49:58
【问题描述】:

我有这段代码,但它只是附加了第一个 uiview。我还希望 uiview 中的标签显示来自 arrayTwo 的字符串。它现在只打印计数。

我将情节提要中的 stackView 设置为平均填充。并且只有顶部、尾部和前导约束。

如果我不关心动画,我可以附加到容器 UIView 并且相同的代码应该可以工作吗?显然将stackView换成uiview

class ViewController: UIViewController {
    
    @IBOutlet weak var arrayButton: UIButton!
    @IBOutlet weak var stackView: UIStackView!
    
    var arrayView = MyView()   /// lives inside a nib only has one uilabel
    var arrayOfView: [MyView] = [] 
    var arrayTwo = ["one", "two", "three", "four", "five"]
    var arrayIndex = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        stackView.spacing = 4
    }

    func appendViews() {
        
        for i in 0...arrayTwo.count - 1 {
            arrayOfView.append(arrayView)
            //arrayOfView[I].myLabel.text = arrayTwo[i]
            arrayOfView[i].myLabel.text = arrayTwo.first
            
            stackView.addSubview(arrayOfView[i])
            stackView.addArrangedSubview(arrayOfView[i])
       }
 
    }
    
    @IBAction func arrayButton Action(_ sender: Any) {
        appendViews()
    }
}

【问题讨论】:

    标签: arrays swift uiview uistackview


    【解决方案1】:

    这行代码重复地将同一个对象添加到数组中:

    arrayOfView.append(arrayView)
    

    我假设MyView 是一个继承自UIView 的类,所以在Swift 中具有引用类型语义(read more about value and reference types)。执行此行时,不会创建 MyView 的新实例,而是将对同一现有对象的引用添加到数组中。稍后,当您将子视图添加到堆栈视图时,它只是尝试一遍又一遍地添加相同的视图。

    相反,您需要为每次迭代创建一个 MyView 的新实例。也就是说,您将不再需要 arrayView 属性。

    还有一些其他问题可以解决:

    1. 原始 for 循环可以替换为更安全的 for-in 语句,以避免直接使用数组索引进行操作。
    2. 您几乎从不为UIStackView 调用addSubview,因为它不会自动排列以这种方式添加的视图。只需拨打 addArrangedSubview 即可满足您的需求。
    3. arrayIndex 属性似乎未使用,可以删除。
    4. arrayTwo 不是一个好名字,因为它没有说明任何有关内容和语义的信息,请尝试使其更具描述性,例如 labelTexts

    毕竟你会得到这样的东西:

    for text in labelTexts {
        let myView = MyView()
        arrayOfView.append(myView)
        myView.myLabel.text = text
        stackView.addArrangedSubview(myView)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 2016-01-08
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多