2012-04-12 21 views
7

Potrzebuję sposobu, aby uzyskać wszystkie UILabel s w UIView bez konieczności przechodzenia przez wszystkie widoki w ramach UIView.jak uzyskać wszystkie UILabele w UIView

mam wiele innego rodzaju poglądów, UIButton s, UIImageView s, a byłoby to zbyt długo, aby przejść przez wszystkie z nich, kiedy tylko potrzebujemy UILabel s.

Próbuję uniknąć coś takiego:

for (UIView *view in myView.subviews) 
{ 
    if([view isKindOfClass:[UILabel class]]) 
    { 
     UILabel *lbl = (UILabel*)view; 
    } 
} 

Czy to możliwe, czy ja śnię?

+0

Jak można je utworzyć - w konstruktorze Interface lub w kodzie? –

Odpowiedz

5

Załóż NSArray ivar którym można dodać wszystkie UILabel „s do.

Jeśli zrobisz to w kodzie następnie podczas tworzenia UILabel prostu zrobić

NSMutableArray *labels = [[NSMutableArray alloc] init]; 

// Repeat this for al labels 
UILabel *label = [[UILabel alloc] in... 
[labels addObject:label]; 

// Then 
self.labels = [labels copy]; 

Jeśli używasz IB zadeklarować swoją nieruchomość jak to

@property (nonatomic, strong) IBOutletCollection(UILabel) NSArray *labels; 

i połączyć wszystkie etykiety do tego .

+0

Nie to, czego szukałem, ale jak dotąd najlepsza odpowiedź. – subharb

1

Można ustawić właściwość znacznika na etykiecie .. coś takiego ...

label.tag = 100; 

UILabel *lbl = [yourView viewWithTag:100]; 
+0

Juk nie używać 'viewWithTag:' istnieje wiele lepszych sposobów –

+0

@ Paul.s: dziękuję za komentarz .. Czy mogę wiedzieć, co jest wadą korzystania z viewWithTag? – Aravindhan

+1

FYI Miałem zamiar przegłosować, ale zdecydowałem, że będzie to trochę surowe, ponieważ widzę tę sugestię. To jest po prostu trochę głupie/leniwe - jeśli potrzebujesz odniesienia do widoku i wiesz, że go potrzebujesz, to dlaczego nie zrobić tego z tego? Nie podoba mi się pomysł trałowania w potencjalnie dużej hierarchii widoków, prosząc każdy tag o dowolną wartość, którą można przypadkowo zmienić. Również w tym przypadku OP chciał zwrócić wiele widoków, których ten API by nie zrobił. –

4

Człowieku, musisz użyć rekursji. (Jeśli nie chcesz używać znaczników)

Spróbuj tego.

-(UIView *)checkChild:(UIView *)view{ 

    NSArray *arrayView = view.subviews; 
    UIView *returnView = nil; 

    for (UIView *auxView in arrayView) { 
     if ([auxView isKindOfClass:[UILabel class]]) { 
      return auxView; 
     }else{ 
      returnView = [self checkChild:auxView]; 
     } 
    } 
    return returnView; 
} 
+0

Ładny fragment, powinieneś po prostu zwrócić tablicę elementów znalezionych na ścieżce zamiast zwracać pojedynczy element. Otrzymasz również ostatni element z subviews klasy, której szukasz, ponieważ zawsze zastępujesz ostatni element nową wartością. –

1

lubiłem podejście @SiddharthaMoraes, ale zmienił go, aby zebrać wszystkie elementy znajdujące się na jego drodze. Szukałem dla UILabels wewnątrz mojego UIViewController i nie mógł ich znaleźć, bo gdzie zagnieżdżona wewnątrz innego UIView, więc ta rekurencja powinno rozwiązać problem:

-(NSMutableArray *)checkChild:(UIView *)view{ 

    NSArray *arrayView = view.subviews; 
    NSMutableArray *arrayToReturn = [NSMutableArray new]; 

    for (UIView *auxView in arrayView) { 
     if ([auxView isKindOfClass:[MyLabel class]]) { 
      [arrayToReturn addObject:auxView]; 
     }else if(auxView.subviews){ 
      [arrayToReturn addObjectsFromArray:[self checkChild:auxView]]; 
     } 
    } 
    return arrayToReturn; 
} 
Powiązane problemy