【问题标题】:Get ALL view inside ViewController获取 ViewController 中的所有视图
【发布时间】:2017-11-23 22:13:05
【问题描述】:

我正在尝试获取 UIViewController 中的所有视图。

我正在使用此代码:

    for subview : UIView in self.view.subviews{
        //code here
    }

问题是我没有得到 UIView 中的视图。 所以我得到了除了他们的孩子之外的所有观点。

请问,如何在我的 UIViewController 中获取所有子视图或父视图?即使一个视图有一个孩子有一个孩子有一个孩子。我想浏览所有视图。

提前感谢 :)

(请在 swift 4.0 中使用)

【问题讨论】:

    标签: ios swift uiviewcontroller views


    【解决方案1】:

    你需要递归处理所有子视图。

    func processSubviews(of view: UIView) {
        // 1. code here do something with view
        for subview in view.subviews {
            // 2. code here do something with subview
            processSubviews(of: subview)
            // 3. code here do something with subview
        }
        // 4. code here do something with view
    }
    

    根据您想要的结果,您需要将代码放在位置 1、2、3 或 4(或者可能是其中两个或多个位置)。

    那么你可以这样称呼它:

    processSubviews(of: self.view)
    

    【讨论】:

    • 非常感谢。现在我可以很容易地通过代码调整所有视图的大小:)
    【解决方案2】:

    要获取视图层次结构中的所有视图(如标签、按钮、视图...)并访问 viewController 中的所有子视图,您应该使用递归函数来迭代所有视图:

    func getAllSubviews(view:UIView) {
        for subview in view.subviews {
            if let takenLabel = subview as? UILabel {
                takenLabel.backgroundColor = UIColor.red
            }
            getAllSubviews(view:subview)
        }
    }
    

    您可以使用这个函数来访问其他视图,如按钮并更改它们。

    在这种情况下,我将 viewController 中所有标签的背景颜色更改为红色

    【讨论】:

      【解决方案3】:

      获取子视图的方式有很多种

      获取父视图中的所有子视图

      for subview in view.subviews{
      
            // you can get all of your views one by one here.
      }
      

      过滤任何标记的视图是否可用(假设视图被标记为 100)

              view.subviews.filter{$0.tag == 100}
      

      检查任何视图是否包含子视图的扩展

      extension UIView{
      
          func isAvailabletoParentView(inParentView : UIView, subViewTag : Int) -> Bool{
      
              var isAvailable = false
      
              for subviews in inParentView.subviews{
      
                  if subviews.tag == subViewTag{
      
                      isAvailable = true
                      return true
                  }else{
      
                      isAvailable = false
                  }
              }
              return isAvailable
          }
      }
      

      类似电话分机

      subview.isAvailabletoParentView(inParentView: parentView, subViewTag: anyTagToSubView)
      

      希望它会有所帮助,快乐编码?。

      【讨论】:

        猜你喜欢
        • 2014-12-16
        • 2011-07-23
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 2013-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多