簡體   English   中英

以編程方式獲取自定義UIView嵌入UIStackView中

[英]Programmatically get the custom UIViews embedded inside UIStackView

在我ViewController ,我有12個自定義UIViews (名為CardView)。

在此處輸入圖片說明

我試圖以編程方式遍歷ViewController的子視圖以找到自定義視圖(CardView)並進行一些配置。 以下是我的代碼來計算CardViews的數量。

    private func cardCount()->Int{
            var count = 0
            for subview in self.view.subviews{
                if subview is CardView{
                    count = count + 1
                }
            }
            return count
    }

但是,它返回我“ 0”,原因是我的視圖已嵌入UIStackViews 我在一個垂直對齊的像里面有3個水平對齊的堆棧視圖-

在此處輸入圖片說明

如何以編程方式獲取CardViews。 任何幫助,將不勝感激。

您可以先做一些平面地圖來展平您的視圖結構,然后對它們進行計數:

private func cardCount()->Int{

    var count = 0
    for subview in self.view.subviews.flatMap { $0.subviews }.flatMap { $0.subviews }{
        if subview is CardView{
            count = count + 1
        }
    }
    return count

}

但是我覺得您做事的方式是錯誤的。 卡的數量聽起來像模型中的東西。 您應該有一個名為cardCount的變量,並且屏幕上的卡片應該根據該變量進行更改,而不是相反。

您為每個水平堆棧視圖創建IBOutlet。 然后循環遍歷stackviews中的子視圖。

@IBOutlet weak var StackView1: UIStackView!
@IBOutlet weak var StackView2: UIStackView!
@IBOutlet weak var StackView3: UIStackView!



  for customView in StackView1.arrangedSubviews
  {
     // Do task
  }

嘗試這個

private func cardCount() -> Int
{
    var count = 0
    for subview in self.view.subviews
    {
        if let stackView: UIStackView = subview as? UIStackView
        {
            let arrangedViews = stackView.arrangedSubviews
            for cardView in arrangedViews
            {
                if cardView is CardView
                {
                    count = count + 1
                }
            }

        }
    }
    return count
}

從您共享的圖片圖中,似乎StackView是第一個孩子。 每當您獲得子視圖時,僅返回第一個子視圖。 因此self.view.subviews將只產生一個UIStackView 給每個堆棧視圖添加一個標簽。 然后,在代碼中:

private func cardCount()->Int{
        var count = 0
        for subview in self.view.subviews{
            if subview.tag == 10 {  // parent stack view
                 for subviewStack in subview {  // Get subviews of parent stackview
                      if subviewStack.tag == 11 {  // First stack view child
                          for subViewSubStack in subviewStack.subviews { // Get card views in this stack view
                              // Apply your count logic 
                          }
                      }
                 }

            }
        }
        return count
}  

我只寫了第一個條件。 您可以添加其他人。
話雖如此,我不會說這是最佳的解決方案。 這可以並且應該重構。

創建這樣的擴展方法。 它將計算視圖控制器中的所有CardView實例。

extension UIView {
    func cardCount() -> Int {
        switch self {
        case let self as CardView:
            return 1
        case let self as UIStackView:
            return self.arrangedSubviews.reduce(0, { $0 + $1.cardCount() })
        default:
            return self.subviews.reduce(0, { $0 + $1.cardCount() })
        }
    }
}

並在viewDidLoad調用此方法

class ViewControllerd: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        print(self.view.cardCount())
    }
}

暫無
暫無

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

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