2012-04-12 9 views
7

Ich brauche eine Möglichkeit, alle UILabel s innerhalb einer UIView zu bekommen, ohne durch alle Ansichten innerhalb der UIView gehen zu müssen.Wie bekomme ich alle UILabels innerhalb einer UIView

Ich habe viele andere Art von Ansichten, UIButton s, UIImageView s und es wäre zu lang, um alle zu durchlaufen, wenn ich nur die UILabel s.

Ich versuche, so etwas zu vermeiden:

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

Ist es möglich, oder ich träume?

+0

Wie Sie sie erstellen - im Interface Builder oder in Code? –

Antwort

5

Eine NSArray Ivar mit dem Sie alle UILabel ‚s hinzufügen können.

Wenn Sie es im Code dann tun, wie Sie die UILabel nur schaffen machen

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

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

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

Wenn Sie IB verwenden die Ihre Immobilie erklären wie diese

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

und schließen Sie alle Etiketten dazu angestiftet .

+0

Nicht das, was ich suchte, aber die beste Antwort bisher. – subharb

1

Sie können die Tag-Eigenschaft für das Label .. so etwas wie dieses Set ...

label.tag = 100; 

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

Yuk nicht 'viewWithTag:' gibt es viel bessere Möglichkeiten –

+0

@ Paul.s: Vielen Dank für den Kommentar .. Darf ich wissen, was ist der Nachteil der Verwendung von ViewWithTag? – Aravindhan

+1

FYI Ich wollte unten abstimmen, aber ich entschied, dass es ein bisschen hart sein würde, da ich diesen Vorschlag sehr sehe. Es ist nur ein bisschen nick/faul - wenn Sie einen Verweis auf eine Ansicht benötigen und Sie wissen, dass Sie es brauchen, warum machen Sie dann nicht einen ivar daraus? Ich mag die Idee nicht, durch eine potentiell große Ansichtshierarchie zu fischen, in der jedes Tag nach einem willkürlichen Wert gefragt wird, der versehentlich geändert werden kann. Auch in diesem Fall wollte das OP mehrere Views zurückgeben, was diese API nicht tun würde. –

4

Man, Sie müssen Rekursion verwenden. (Wenn Sie keine Tags verwenden möchten)

Versuchen Sie dies.

-(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

Nice Snippet, Sie sollten einfach ein Array von Elementen auf Ihrem Weg zurückgeben, anstatt ein einzelnes Element zurückzugeben. Sie erhalten auch nur das letzte Element aus den Teilansichten der gesuchten Klasse, da Sie immer das letzte Element mit einem neuen Wert überschreiben. –

1

Ich mochte den Ansatz von @SiddharthaMoraes, aber änderte es, um alle Elemente zu sammeln, die auf seinem Pfad gefunden wurden. Ich war auf der Suche für die UILabels in meinem UIViewController und konnte sie nicht finden, weil sie in einer anderen UIView verschachtelt, wo, so dass diese Rekursion sollte das Problem lösen:

-(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; 
}