2012-04-12 18 views
7

Necesito una forma de obtener todos UILabel s dentro de un UIView sin tener que pasar por todas las vistas dentro del UIView.cómo obtener todos los UILabels dentro de un UIView

Tengo muchos otros tipos de vistas, UIButton s, s UIImageView y sería demasiado tiempo para ir a través de todos ellos cuando sólo necesito los UILabel s.

estoy tratando de evitar algo como esto:

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

¿Es posible o estoy soñando?

+0

¿Cómo se crea ellos - en Interface Builder o en el código? –

Respuesta

5

Crear Ivar NSArray que se pueden agregar todos los UILabel 's a.

Si lo haces de código a continuación, a medida que crea el UILabel acaba de hacer

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

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

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

Si utiliza IB al declarar su propiedad como esta

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

y conectar todas las etiquetas hasta este .

+0

No es lo que estaba buscando, pero la mejor respuesta hasta el momento. – subharb

1

Usted puede establecer la propiedad de etiqueta para la etiqueta .. algo como esto ...

label.tag = 100; 

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

Yuk no usa 'viewWithTag:' hay formas mucho mejores –

+0

@ Paul.s: gracias por el comentario .. ¿Puedo saber cuál es la desventaja de usar viewWithTag? – Aravindhan

+1

FYI Iba a votar abajo, pero decidí que sería un poco duro ya que veo esta sugerencia mucho. Es un poco cutre/perezoso: si necesita una referencia a una vista y sabe que la necesita, ¿por qué no hacer una ivar? No me gusta la idea de buscar en una jerarquía de vistas potencialmente grande pidiendo a cada etiqueta un valor arbitrario que pueda modificarse accidentalmente. También en este caso, OP quería que se devolvieran varias vistas, lo que esta API no haría. –

4

Hombre, es necesario recursionar. (Si no desea usar etiquetas)

Pruebe esto.

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

Buen fragmento, solo debes devolver una matriz de elementos encontrados en tu ruta en lugar de devolver un solo elemento. También obtendrá el último elemento de las subvistas de la clase que está buscando porque siempre sobrescribe el último elemento con un nuevo valor. –

1

Me gustó el enfoque de @SiddharthaMoraes, pero lo cambié para recoger todos los elementos encontrados en su camino. Yo estaba buscando el UILabels dentro de mi UIViewController y no podía encontrar ellos porque donde anidarse dentro de otro UIView, por lo que este recursividad debería resolver el 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; 
} 
Cuestiones relacionadas