获取 ViewController 中的所有视图

Posted

技术标签:

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

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

我正在使用此代码:

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

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

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

提前感谢 :)

(请在 swift 4.0 中使用)

【问题讨论】:

【参考方案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)

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

【讨论】:

以上是关于获取 ViewController 中的所有视图的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中的 ONE ViewController 中的视图之间传递数据

从 AppDelegate 中的 ViewController 获取参数。

如何从 ViewController 中的 xib (nib) 实例化 UIView / UITableView

如何为自定义表格视图单元格中的按钮单击获取不同的视图控制器

使用通过 ViewController 从 XIB 加载的子视图中的对象时出错

试图从一个 Viewcontroller 中的 UILabel 获取 NSString 以放置在另一个 Viewcontroller 的 UITextView 中