获取 ViewController 内的所有视图

Get ALL view inside ViewController

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

我正在使用此代码:

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

问题是我没有获得 UIView 内的视图。 所以除了他们的 children.

我得到了所有视图

请问,如何在我的 UIViewController 中获取 child 或 parent 的所有视图?即使视图有一个 child 有一个 child 有一个 child。我要浏览所有视图。

提前致谢:)

(请在swift 4.0)

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

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)

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

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

您可以使用此函数访问按钮等其他视图并更改它们。

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

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

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

for subview in view.subviews{

      // you can get all of your views one by one here.
}

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

        view.subviews.filter{[=11=].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)

希望对您有所帮助,编码愉快。