簡體   English   中英

在 Swift 中以編程方式向 stackview 添加視圖

[英]Add views to stackview programmatically in Swift

我有一個水平的 Stack View,它填滿了屏幕的整個寬度,並包含 3 個垂直的 StackView,在加載控制器時它們是空的。 水平對齊設置為填充和分布等間距,垂直對齊左、中、右和分布填充相等。 當用戶稍后導航回此場景時,我可能想要填充這些 StackView。 因此,我覆蓋了viewWillAppear並在內部執行了以下操作:

DispatchQueue.global(qos: .userInitiated).async {
    // here i need to load the data for the labels
    DispatchQueue.main.async {
        var label = UILabel()
        label.text = //...
        self.firstStackView.addArrangedSubview(label)
        label = UILabel()
        label.text = //...
        self.secondStackView.addArrangedSubview(label)
        var btn = UIButton()
        btn.setTitle("X", for: .normal)
        btn.addTarget(//...)
        self.thirdStackView.addArrangedSubview(btn)
    }
}

現在,我只看到第三個堆棧視圖的按鈕。 即使我多次這樣做,我也只能看到第一個按鈕。 我認為這是因為 stackviews 一開始是空的,並且它們的大小沒有更新。 我是否必須調用任何函數,以便它重新創建所有視圖? (但使用新的子視圖)

編輯:我找到了一個解決方法:我為故事板中的 3 個堆棧視圖中的每一個添加了一些標簽,然后在代碼中再次刪除它們。 它有效,但我認為這不是一個好的解決方案,如果我需要再次刪除標簽,堆棧視圖不會變小。 一定會有更好的辦法。

private var lbl1: UILabel!
private var lbl2: UILabel!
private var horizontalStackView: UIStackView!

private let setupLabelBlock = { () -> UILabel in
    let label = UILabel()
    label.textColor = .white
    label.setFontSize(16)
    label.textAlignment = .center
    return label
}

private func setupSubviews() {
    setupLabels()
    setupHorizontalStackView()
}

private func setupLabels() {
    lbl1 = setupLabelBlock()
    lbl2 = setupLabelBlock()
}

private func setupHorizontalStackView() {
    horizontalStackView = UIStackView(arrangedSubviews: [lbl1, lbl2])
    horizontalStackView.axis = .horizontal
    horizontalStackView.alignment = .fill
    horizontalStackView.distribution = .fill
    horizontalStackView.spacing = 2
}

根據要求調用setupSubviews方法。 我希望,解決方案對您有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM