在ViewController中获取所有视图

时间:2017-11-23 22:13:06

标签: ios swift uiviewcontroller views

我想在我的UIViewController中获取所有视图。

我正在使用此代码:

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

问题是我没有得到UIView内部的视图。 除了他们的孩子,我得到了所有的看法。

请问,我怎样才能在UIViewController中获得所有子视图或父视图?即使视图中有一个孩子有孩子也有孩子。我想通过所有观点。

预先

thanx:)

(请在swift 4.0中)

3 个答案:

答案 0 :(得分:2)

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

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)

答案 1 :(得分:0)

要获取视图层次结构中的所有视图(如Label,Button,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中所有标签的背景颜色更改为红色

答案 2 :(得分:0)

获取子视图的方式有很多

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

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)

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