使用函数递归循环遍历数组数组

时间:2016-02-22 15:29:05

标签: ios swift

我想遍历我的视图子视图,并通过其子视图等循环遍历每个子视图。

所以我要说我有以下代码:

let view = myVC.view
view.backgroundColor = UIColor.clearColor()

然后对每个子视图重复相同的操作。我想在功能上做到这一点。

非常感谢任何见解。

编辑:

说清楚

我正在寻找类似的东西:

view.subviews.chanageColor() { (aView, aColor) in
aView.backgroundColor = aColor
}

但它应该是递归的,它会转到每个视图子视图。

4 个答案:

答案 0 :(得分:4)

这样的东西?

func makeAllSubviewsClear(view: UIView!)
{
    view.backgroundColor = UIColor.clearColor()
    for eachSubview in view.subviews
    {
        makeAllSubviewsClear(eachSubview)
    }
}

来自:

let view = myVC.view
makeAllSubviewsClear(view)

答案 1 :(得分:2)

使用队列而不是递归。

我认为你可以这样做......

var myObject = await unitOfWork.MyObjects.SingleAsync(o => o.Name == objectName);

我是用队列来做的,而不是递归地做。但这种方法不起作用。

做你想要的问题

你可以这样做,这就是你在问题中提出的想法。

extension UIView {    
    func changeColor(color: UIColor) {
        var queue = [self]

        while let view = queue.first() {
            queue += view.subviews

            view.backgroundColor = color

            queue.remove(view)
        }
    }
}

然后像......一样运行它。

extension UIView {
    // this name isn't very good but you get the idea
    func applyChangeToAllSubviews(block: (UIView) -> ()) {
        var queue = [self]

        // I don't have my dev computer dos not sure of the syntax
        while let view = queue.first() {
            queue += view.subviews

            block(view)

            queue.remove(view)
        }
    }
}

我想这有点功能......等等。

答案 2 :(得分:1)

怎么样:

let _ = myVC.view.subviews.map{ $0.backgroundColor = UIColor.clearColor() }

虽然地图应该以不同的方式使用imho。

编辑: 我只是看起来OP想要递归循环,这是另一回事。您应该将此代码移动到函数中,并为每个$ 0递归调用它。

或许这样的事情:

extension Array where Element: UIView {
    func changeColor(color: UIColor) {
        for view in self {
            view.subviews.changeColor(color)
            view.backgroundColor = color
        }
    }
}

看起来很实用,可以像这样调用:

myVC.view.subviews.changeColor(color)

受@fogmaister启发的另一个解决方案:

extension Array where Element: UIView {
    func applyChange(closure: (UIView)->()) {
        for view in self {
            view.subviews.applyChange(closure)
            closure(view)
        }
    }
}

答案 3 :(得分:0)

这是一种可能的通用解决方案 遍历任何"嵌套序列"。它不仅限于UIViewsubviews,但是接受一个参数,将每个序列元素映射到其直接子元素。

它还将遍历序列的任务与 动作对元素(如设置背景颜色),返回Generator 可以与forEach()等现有方法一起使用。

(这受到Implementing recursive generator for simple tree structure in Swift的一些答案的启发。)

extension SequenceType {

    public func generate<S : SequenceType where S.Generator.Element == Generator.Element>
        (children children: Generator.Element -> S) -> AnyGenerator<Generator.Element> {

            var selfGenerator = self.generate()
            var childGenerator : AnyGenerator<Generator.Element>?

            return anyGenerator {
                // Enumerate all children of the current element:
                if childGenerator != nil {
                    if let next = childGenerator!.next() {
                        return next
                    }
                }

                // Get next element of self, and prepare subGenerator to enumerate its children:
                if let next = selfGenerator.next() {
                    childGenerator = children(next).generate(children: children)
                    return next
                }

                return nil
            }
    }
}

例如,如果viewUIView,那么

view.subviews.generate(children: { $0.subviews })

返回所有(嵌套)子视图的(懒惰)生成器。通过在此生成器上调用forEach(),我们可以修改每个子视图:

view.subviews.generate(children: { $0.subviews }).forEach {
    $0.backgroundColor = UIColor.clearColor()
}

但它也可用于获取包含所有嵌套子视图的数组:

let allViews = Array(view.subviews.generate(children: { $0.subviews }))