2016-11-06 34 views
0

我正在尝试做一个循环来遍历视图中找到的所有UIButtons,以便更改每个按钮的位置。 (参见下面的代码)如何在Swift 3.0中遍历屏幕上的所有UIButtons?

 for case let button as UIButton in self.view.subviews { 
      rect = button.frame 
      rect.origin.x = rect.origin.x + 20 
      rect.origin.y = rect.origin.y + 20 
      button.frame = rect 
     } 

然而,当我调试代码我发现环路没有找到任何按钮,因此,位置保持不变。 View Controller中有一个View中有9个按钮。

任何人都知道这个循环有什么问题吗?

+0

您的按钮是否指向'self.view'的子视图,还是它们在视图层次结构中进一步向下? – rmaddy

+0

@rmaddy的层次结构是这样的视图控制器 - >查看 - >按钮 – forseth31

回答

2

你的代码适合我。其含义是,您的按钮是而不是子视图self.view,但子视图进一步向下层次结构。你将不得不编写循环的递归版本。

例如:

func lookForButton(_ v: UIView) { 
    let subs = v.subviews 
    if subs.count == 0 {return} 
    for vv in subs { 
     if vv is UIButton { 
      print(vv) // just testing: do your real stuff here 
     } 
     lookForButton(vv) 
    } 
} 
lookForButton(self.view) 
+0

我不相信你想在这段代码中的第二个'return'语句。这将跳过当前级别的任何其他按钮。 – rmaddy

+0

@rmaddy它可能不是很好,但我认为这是公平的,假设UIButton本身没有值得期待的子视图。特别是,它肯定不会有另一个按钮作为它的子视图。那么为什么要浪费周期呢? – matt

+0

但'subs'可能有多个按钮。那个'return'只会导致第一个按钮被处理。 – rmaddy

0

您的代码工作。这:

var view = UIView() 
view.addSubview(UIView()) 
view.addSubview(UIButton()) 

for case let button as UIButton in view.subviews { 
    print(button) 
} 

打印:

<UIButton: 0x7fcc9bd07320; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x60000002dca0>> 

结论:self.view.subviews不含任何UIButtons

+0

这不是一个有效的测试。不要创建一个'UIView'数组。创建一个'UIView',然后将其他视图添加为子视图。 – rmaddy

+0

UIView.subviews _is_ UIViews数组。无论如何更新的答案更加精确。也许添加一个self.view.subviews的日志。 – shallowThought