繁体   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