2016-11-06 30 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