2017-03-06 18 views
1

でUIButtonsをループ:以下のように私は私のセットアップを持っているUIViewの

のUIView(1) - > UIScrollViewの - > UIStackview - > UIViews(2) - > UIButton

どのようにすべての内のすべてのUIButtonをループしますUIStackviewのUIViews(2)?私はUIView(1)でボタンを増やしているので、ViewController全体のすべてのボタンをループすることはできません。私は試みました:

for view in self.stackview.subviews as [UIView] { 
    if let btn = view as? UIButton { 
     print("Worked") 
    } 
} 
for view in self.scrollview.subviews as [UIView] { 
    if let btn = view as? UIButton { 
     print("Worked") 
    } 
} 
for case let button as UIButton in self.scrollview.subviews { 
    print("worked") 
} 
for case let button as UIButton in self.stackview.subviews { 
    print("worked") 
} 

これは私のviewDidLoad関数でこれを追加しようとしても印刷されません。私はここで間違って何をしていますか?

+0

を[UIViewの] {場合せBTN =ビューほど:カテゴリを使用して? Ubutton {print( "Worked")}他のasubViewのview.subviewsとして[UIView] {if let btn = view as? UIButton {print( "Worked")}}} '? – Larme

答えて

3

念頭に来る最初のソリューション:

let buttons = self.stackview.subviews // direct subviews of stack view 
    .map { subview in subview.subviews } // second level subviews 
    .joined() // join the second level subviews into one flat array 
    .flatMap { $0 as? UIButton } // filter buttons 

基本的に、2番目のレベルにジャンプすることを忘れているだけです。最初のレベルのサブビューのみを反復しています。

さらに安定したソリューションが必要な場合は、任意の深度のサブビューを再帰的に反復することができます。 self.stackview.subviewsのビューのための `

extension UIView { 
    var allSubviews: [UIView] { 
     return self.subviews + self.subviews.map { $0.allSubviews }.joined() 
    } 
} 

、次いで

let buttons = self.stackview.allSubviews.flatMap { $0 as? UIButton } 
+0

ありがとう、これはforループを作るのに本当に便利です! – Petravd1994

+0

クールな機能スタイルのソリューション。 (投票された) –

1

どの程度...

for view in stackView.subviews { 
    for case let button as UIButton in view.subviews { 
     print(button.title(for: .normal)) // Do something with button 
    } 
} 

または

for case let button as UIButton in stackView.subviews.flatMap({ $0.subviews }) { 
    print(button.title(for: .normal)) // Do something with button 
} 

または

for button in stackView.subviews.flatMap({ $0.subviews }).flatMap({ $0 as? UIButton }) { 
    print(button.title(for: .normal)) // Do something with button 
} 
関連する問題