我在UIView中有一個自定義類的按鈕,我想將它添加到數組中,以便它們易於訪問。有沒有辦法獲得特定類的所有子視圖並將其添加到Swift中的數組?Swift:獲取特定類型的所有子視圖並添加到數組
回答
使用is
運算符的filter
函數可以篩選特定類的項目。
let myViews = view.subviews.filter{$0 is MyButtonClass}
MyButtonClass
是要過濾的自定義類。
我現在不能測試,但本應在斯威夫特2工作:
view.subviews.flatMap{ $0 as? YourView }
它返回YourView
這裏的數組的一個測試,典型的例子,得到一個數:
countDots = allDots!.view.subviews.flatMap{$0 as? Dot}.count
如果你想更新/訪問這些特定的子視圖,然後用這個,
for (index,button) in (view.subviews.filter{$0 is UIButton}).enumerated(){
button.isHidden = false
}
要遞歸地做到這一點(即獲取所有子視圖的觀點藏漢),你可以使用這個通用功能:
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)
在這裏你去
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)
對於這種情況,我想我們可以用斯威夫特的first.where
語法,這比filter.count
,filter.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
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)
你並沒有完全回答OP的問題。你的'func'應該返回一個視圖數組,因爲這就是OP所要求的;爲什麼'UITextField'? 'MyCustomButton'會更合適。 – dirkgroten
- 1. 從superView獲取特定類型視圖的所有元素
- 2. Swift通用數組到特定類型
- 3. 獲取所有特定產品類型
- 4. 如何刪除特定類型的所有子視圖
- 5. 迭代特定類型的所有子視圖
- 6. 將UIView作爲子視圖添加到自定義類,UIView的子類Swift
- 7. Swift將座標添加到數組並添加到地圖
- 8. 爲什麼添加元素到特定的子數組會影響給定數組的所有子數組?
- 9. Swift獲取數組的通用類型
- 10. 如何獲取模塊定義的所有子類(特定類)?
- 11. 獲取單元格onClick在UICollectionView中的所有子視圖swift
- 12. 獲取數組中特定長度的所有子陣列
- 13. 添加子視圖到主視圖在tableViewController添加子視圖到表視圖,而不是在swift視圖
- 14. Swift - 具有特定類別類型的數組
- 15. Swift:將子視圖添加到另一個子視圖
- 16. 將類添加到具有特定類不工作的div的所有孩子
- 17. 如何獲取所有類別的所有帖子自定義帖子類型?
- 18. 如何在刪除後添加多視圖並刪除視圖並從視圖中獲取所有數據?
- 19. 推下所有視圖並添加自定義視圖
- 20. PHP,在一個數組中獲取特定類型的所有項目
- 21. 獲取具有特定類別的所有子元素的ID
- 22. 將子視圖添加到UINavigationController子類
- 23. 將子視圖添加到UICollectionViewCell子類?
- 24. 添加子視圖到具有子視圖類功能的主視圖
- 25. 將類對象添加到數組[swift]
- 26. 獲取特定類型的
- 27. 如何找到添加到特定值的子陣列的所有組合
- 28. 獲取視圖正在平移的字典鍵並將其添加到數組
- 29. 將字典類型添加到Swift中的數組
- 30. Swift將viewController作爲子視圖添加到其他視圖
這工作,但語法有點關閉:應該讓myViews = view.subViews。過濾器({$ 0是MyButtonClass}) –
語法被稱爲「Trailing Closure」symtax:*'如果提供閉包表達式作爲函數的唯一參數,並且將該表達式作爲尾隨閉包提供,則不需要編寫一對當你調用函數時,函數的名字後面有括號().' * – vadian
我很好奇,如果有辦法讓這個方法可鏈接的話 – Trip