2012-04-12 12 views
7

Ho bisogno di un modo per ottenere tutte le UILabel s all'interno di un UIView, senza dover passare attraverso tutti i punti di vista all'interno del UIView.come ottenere tutte le UILabels entro un UIView

Ho molti altri tipi di visualizzazioni, UIButton s, UIImageView s e sarebbe troppo lungo per passare attraverso tutti quando ho solo bisogno di UILabel s.

che sto cercando di evitare qualcosa di simile:

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

È possibile o Sto sognando?

+0

Come si crea loro - in Interface Builder o in codice? –

risposta

5

Creare un NSArray ivar cui è possibile aggiungere tutte le UILabel 's a.

Se lo fate in codice poi come si crea il UILabel basta fare

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

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

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

Se si utilizza IB il dichiarare la vostra proprietà come questa

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

e collegare tutte le etichette fino a questo .

+0

Non è quello che stavo cercando, ma la migliore risposta finora. – subharb

1

È possibile impostare la proprietà tag per l'etichetta .. qualcosa di simile ...

label.tag = 100; 

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

Non usare 'viewWithTag:' ci sono modi migliori –

+0

@ Paul.s: grazie per il commento .. Posso sapere qual è lo svantaggio dell'uso di viewWithTag? – Aravindhan

+1

FYI Stavo per votare, ma ho deciso che sarebbe stato un po 'duro vedere questo suggerimento molto. È solo un po 'nas/pigro - se hai bisogno di un riferimento a una vista e sai di averne bisogno, allora perché non farne un ivar? Non mi piace l'idea di trascinare attraverso una gerarchia di viste potenzialmente ampia chiedendo a ogni tag un valore arbitrario che può essere accidentalmente cambiato. Anche in questo caso l'OP voleva che fossero restituite più viste, cosa che questa API non avrebbe fatto. –

4

Uomo, è necessario utilizzare la ricorsione. (Se non si desidera utilizzare i tag)

Prova questo.

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

Snippet piacevole, dovresti solo restituire un array di elementi trovati sul tuo percorso invece di restituire un singolo elemento. Riceverai anche l'ultimo elemento dalle sottoview della classe che stai cercando perché sovrascrivi sempre l'ultimo elemento con un nuovo valore. –

1

Mi è piaciuto l'approccio di @SiddharthaMoraes, ma l'ho modificato per raccogliere tutti gli elementi trovati sul suo percorso. Cercavo la UILabels dentro la mia UIViewController e non poteva trovare loro perché dove annidati all'interno di un altro UIView, quindi questo ricorsione dovrebbe risolvere il problema:

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