Swift:获取特定types的所有子视图并添加到数组中

我有一个UIViewbutton的自定义类,我想添加到一个数组,使他们很容易访问。 有没有办法让一个特定的类的所有子视图,并将其添加到数组中的Swift?

使用is运算符的filter函数可以筛选特定类的项目。

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

MyButtonClass是要过滤的自定义类。

干得好

  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) 

我现在无法testing,但这应该在Swift 2中工作:

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

其中返回YourView的数组

这是一个经过testing的典型例子,

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

要做到这一点recursion(即获取所有子视图的好处),你可以使用这个通用函数:

 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) 

如果你想更新/访问这些特定的子视图然后使用这个,

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

对于这种情况,我想我们可以使用Swift的first.where语法,它比filter.countfilter.isEmpty更有效。

因为当我们使用filter ,它会创build一个底层数组,从而无效,想象我们有一个大集合。

所以只要检查一个视图的subViews集合是否包含一个特定的类,我们可以使用这个

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

相当于:在此视图的subViews集合中查找BannerView类的第一个匹配项。 所以如果这是真的,我们可以进一步推行我们的逻辑。

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

UIView有一个名为subViews的属性,你可以看到API。