递归查找特定类型的iOS视图

时间:2019-02-20 07:38:58

标签: ios swift recursion uiview subview

我有一个Map<NameWrapper, List<Person>> group = persons.stream() .collect(Collectors.groupingBy(p -> new NameWrapper(p.getName()))); ,我想解析该视图的所有子视图并返回类型为UIView的子视图的实例

使用CustomClass只能访问直接子视图,我想解析所有子视图并返回符合条件的子视图。

view.subviews

我知道我需要递归地解决此问题,但是我确信该视图仅存在一个实例,因此一旦找到该实例,我将要返回并中断递归。

我怎么能做到这一点。

4 个答案:

答案 0 :(得分:0)

func findView(key: String, view: UIView) -> UIView? {
    for subview in view.subviews {
        if subview.key == key {
            return subview
        } else {
            return findView(key: key, view: subview)
        }
    }

    return nil
}

注意:键未在UIView上定义,因此定位逻辑假定您已通过协议或扩展名定义了

答案 1 :(得分:0)

这是带有View标签的功能,您可以将其替换为唯一键。

func findView(tag :Int, view : UIView) -> UIView? {
    if view.tag == tag {
        return view
    }

    for subview in view.subviews {
        if let v = findView(tag: tag, view: subview) {
            return v
        }
    }

    return nil
}

答案 2 :(得分:0)

您要使用uniqueKey为自定义视图提供资金,然后使用以下函数根据需要获取结果。

func findView(key : uniqueKey , view : UIView) -> customView? {
        var fondSubview:customView!

        for subview in view.subviews {
            if subview.uniqueKey == key {
               fondSubview = subview as! customView
                break
            }
        }        
        return fondSubview
    }

答案 3 :(得分:0)

您可以使用此通用UIView扩展方法查找特定类的任何对象。如果该类不存在子视图,则返回nil。

extension UIView {
    func find<T:UIView>(_ ofType:T.Type) -> T? {
        if let test = subviews.first(where: { $0 is T }) as? T {
            return test
        } else {
            for view in subviews {
                return view.find(ofType)
            }
        }
        return nil
    }
}

用法

let firstBtn = self.view.find(UIButton.self)