2015-08-22 41 views

回答

33

使用is運算符的filter函數可以篩選特定類的項目。

let myViews = view.subviews.filter{$0 is MyButtonClass} 

MyButtonClass是要過濾的自定義類。

+1

這工作,但語法有點關閉:應該讓myViews = view.subViews。過濾器({$ 0是MyButtonClass}) –

+3

語法被稱爲「Trailing Closure」symtax​​:*'如果提供閉包表達式作爲函數的唯一參數,並且將該表達式作爲尾隨閉包提供,則不需要編寫一對當你調用函數時,函數的名字後面有括號().' * – vadian

+0

我很好奇,如果有辦法讓這個方法可鏈接的話 – Trip

1

UIView有一個名爲subViews的屬性,你可以看到API。

+0

你必須這樣寫: view.subviews.flatMap {$ 0作爲? YourView} – Maybe1

10

我現在不能測試,但本應在斯威夫特2工作:

view.subviews.flatMap{ $0 as? YourView } 

它返回YourView

這裏的數組的一個測試,典型的例子,得到一個數:

countDots = allDots!.view.subviews.flatMap{$0 as? Dot}.count 
3

如果你想更新/訪問這些特定的子視圖,然後用這個,

for (index,button) in (view.subviews.filter{$0 is UIButton}).enumerated(){ 
    button.isHidden = false 
} 
5

要遞歸地做到這一點(即獲取所有子視圖的觀點藏漢),你可以使用這個通用功能:

private func getSubviewsOf<T : UIView>(view:UIView) -> [T] { 
    var subviews = [T]() 

    for subview in view.subviews { 
     subviews += getSubviewsOf(view: subview) as [T] 

     if let subview = subview as? T { 
      subviews.append(subview) 
     } 
    } 

    return subviews 
} 

獲取所有UILabel的視圖中的層次,只是這樣做:

let allLabels : [UILabel] = getSubviewsOf(view: theView) 
10

在這裏你去

extension UIView { 

    /** This is the function to get subViews of a view of a particular type 
*/ 
    func subViews<T : UIView>(type : T.Type) -> [T]{ 
     var all = [T]() 
     for view in self.subviews { 
      if let aView = view as? T{ 
       all.append(aView) 
      } 
     } 
     return all 
    } 


/** This is a function to get subViews of a particular type from view recursively. It would look recursively in all subviews and return back the subviews of the type T */ 
     func allSubViewsOf<T : UIView>(type : T.Type) -> [T]{ 
      var all = [T]() 
      func getSubview(view: UIView) { 
       if let aView = view as? T{ 
       all.append(aView) 
       } 
       guard view.subviews.count>0 else { return } 
       view.subviews.forEach{ getSubview(view: $0) } 
      } 
      getSubview(view: self) 
      return all 
     } 
    } 

你可以這樣調用它

let allSubviews = view.allSubViewsOf(type: UIView.self) 
let allLabels = view.allSubViewsOf(type: UILabel.self) 
1

對於這種情況,我想我們可以用斯威夫特的first.where語法,這比filter.countfilter.isEmpty更高效。

因爲當我們使用filter時,它會創建一個底層數組,因此效果不佳,想象我們有一個大集合。

所以只是檢查是否視圖的subViews集合包含特定種類的類,我們可以利用這個

let containsBannerViewKind = view.subviews.first(where: { $0 is BannerView }) != nil 

這相當於:找我的第一場比賽,以BannerView類此觀點的子視圖收藏。所以如果這是真的,我們可以執行我們的進一步邏輯。

參考:https://github.com/realm/SwiftLint/blob/master/Rules.md#first-where

0
func allSubViews(views: [UIView]) { 
    for view in views { 
     if let tf = view as? UITextField { 
      // Do Something 
     } 
     self.allSubViews(views: view.subviews) 
    } 
} 

self.allSubViews(views: self.view.subviews) 
+0

你並沒有完全回答OP的問題。你的'func'應該返回一個視圖數組,因爲這就是OP所要求的;爲什麼'UITextField'? 'MyCustomButton'會更合適。 – dirkgroten

相關問題