Mam niestandardową klasę przycisków w UIView, które chciałbym dodać do tablicy, aby były łatwo dostępne. Czy istnieje sposób, aby uzyskać wszystkie subviews danej klasy i dodać ją do tablicy w Swift?Swift: Pobierz wszystkie subviews określonego typu i dodaj do tablicy
Odpowiedz
Funkcja filter
przy użyciu operatora is
może filtrować elementy określonej klasy.
let myViews = view.subviews.filter{$0 is MyButtonClass}
MyButtonClass
jest klasa zwyczaj być filtrowana.
UIView ma właściwość o nazwie subViews
, można zobaczyć interfejs API.
Trzeba napisać tak: view.subviews.flatMap {$ 0 jak? YourView} – Maybe1
nie mogę przetestować go już teraz, ale to powinno działać w Swift 2:
view.subviews.flatMap{ $0 as? YourView }
Które zwraca tablicę YourView
Oto sprawdzony, typowy przykład, aby uzyskać count:
Jeśli chcesz zaktualizować/dostęp do tych konkretnych subviews następnie użyć tego,
for (index,button) in (view.subviews.filter{$0 is UIButton}).enumerated(){
button.isHidden = false
}
Aby to zrobić rekursywnie (Ie pobierania widokami podrzędny za aswell), można użyć tego rodzajowego funkcję:
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
}
pobrać wszystkie UILabel w hierarchii widoku, po prostu to zrobić:
let allLabels : [UILabel] = getSubviewsOf(view: theView)
Tu idziesz
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
}
}
można nazwać jak
let allSubviews = view.allSubViewsOf(type: UIView.self)
let allLabels = view.allSubViewsOf(type: UILabel.self)
W tym przypadku, myślę, że możemy korzystać Swift first.where
składni, który jest bardziej wydajny niż filter.count
, filter.isEmpty
.
Ponieważ gdy użyjemy filter
, stworzy on podstawową tablicę, więc nie będzie skuteczna, wyobraźmy sobie, że mamy dużą kolekcję.
Więc po prostu sprawdzić, czy rzutem za subViews
kolekcja zawiera specyficzny rodzaj klasy, możemy użyć tego
let containsBannerViewKind = view.subviews.first(where: { $0 is BannerView }) != nil
których równoważna: znajdź mnie pierwszy mecz klasy BannerView w tym widoku za subviews kolekcji. Jeśli to prawda, możemy przeprowadzić naszą dalszą logikę.
referencyjny: 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)
nie odpowiadasz dokładnie na pytanie OP. Twój 'func' powinien zwrócić tablicę widoków, ponieważ to właśnie zadał OP; i dlaczego "UITextField"? "MyCustomButton" byłoby bardziej odpowiednie. – dirkgroten
- 1. Powtórz wszystkie subviews określonego typu
- 2. pobierz wszystkie elementy określonego formularza
- 3. Usunięcie określonego elementu tablicy, równego ciągowi - Swift
- 4. Pobierz wszystkie problemy Jira dla określonego projektu
- 5. Szyny - dodaj atrybuty i dodaj do tablicy
- 6. Swift usuń subviews z podglądu
- 7. Usuń wszystkie elementy z tablicy pasujące do określonego ciągu
- 8. Swift dodać wszystkie elementy z tablicy razem
- 9. Dodaj element do tablicy
- 10. Pobierz wszystkie pliki określonego typu ze strony internetowej za pomocą wget
- 11. Pobierz wszystkie zmienne JS zaczynające się od określonego ciągu
- 12. (Swift) Przechowywanie i pobieranie tablicy do NSUserDefaults
- 13. pobierz obraz z ikonki i dodaj do href
- 14. Usuń wszystkie dane z określonego obiektu Realm Swift
- 15. Dodaj nowy obiekt do tablicy
- 16. Pętla przez wszystkie subviews widoku Androida?
- 17. Potrzebujesz przechwycić UIView do UIImage, włączając wszystkie subviews
- 18. autoLayout i subviews
- 19. Jak załatać wszystkie dokumenty określonego typu w RavenDB?
- 20. Swift: Downcast do znanego typu
- 21. Dodaj wszystkie elementy do iteracji do listy
- 22. ActionFilterAttribute - zastosowanie do działań określonego kontrolera typu
- 23. Dodaj UIToolBar do wszystkich klawiatur (swift)
- 24. coredata - pobierz jeden atrybut do tablicy
- 25. Dodaj NSUnderlineStyle.PatternDash do NSAttributedString w Swift?
- 26. Programowo dodawaj subviews do UIStackView
- 27. Dodaj nagłówek do UITableView programowo za pomocą Swift 2.2
- 28. Linq Zaznacz wszystkie elementy pasujące do tablicy
- 29. Pobierz wszystkie okna uchwyty do procesu
- 30. Git - Dodaj wszystkie nowe pliki do repozytorium
To działało, ale składnia była trochę wyłączona: Powinien być dozwolony myViews = view.subViews.filter ({$ 0 to MyButtonClass}) –
Składnia jest nazywana symtektem "Trailing Closure": * 'Jeśli wyrażenie zamknięcia jest podane jako jedyny argument funkcji i podajesz to wyrażenie jako końcowe zamknięcie, nie musisz pisać pary nawiasów() po nazwie funkcji, gdy wywołujesz funkcję "* – vadian
Jestem ciekawy, czy istnieje sposób na uczynienie tej metody łańcuchem – Trip