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.count
, filter.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。