我想遍历我的视图子视图,并通过其子视图等循环遍历每个子视图。
所以我要说我有以下代码:
let view = myVC.view
view.backgroundColor = UIColor.clearColor()
然后对每个子视图重复相同的操作。我想在功能上做到这一点。
非常感谢任何见解。
编辑:
说清楚
我正在寻找类似的东西:
view.subviews.chanageColor() { (aView, aColor) in
aView.backgroundColor = aColor
}
但它应该是递归的,它会转到每个视图子视图。
答案 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)
这是一种可能的通用解决方案
遍历任何"嵌套序列"。它不仅限于UIView
和subviews
,但是接受一个参数,将每个序列元素映射到其直接子元素。
它还将遍历序列的任务与
动作对元素(如设置背景颜色),返回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
}
}
}
例如,如果view
是UIView
,那么
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 }))