2012-01-25 11 views
5

Iterar todas las UIViews en las subvistas de una clase y luego verificar el tipo en el ciclo usando isKindOfClass hizo que mi código parezca redundante. Así que escribí el siguiente método que ejecuta un bloque para cada subvista.Iterar todas las subvistas de un tipo específico

@implementation Util 

+ (void)iterateOverSubviewsOfType:(Class)viewType 
        view:(UIView*)view 
        blockToExecute:(void (^)(id subview))block 
{ 
    for (UIView* subview in view.subviews) { 
     if ([subview isKindOfClass:viewType]) { 
      block(subview); 
     } 
    } 
} 

@end 

El bloque pasado a este método toma un argumento de tipo id. El tipo utilizado aquí debe ser, por supuesto, el mismo que pasó el primer argumento. Sin embargo, hasta ahora no he encontrado una manera de hacer que este tipo de seguro.

Respuesta

11

Pruébalo así, debería ser lo suficientemente seguro.

for (id subview in view.subviews) { 
     if ([subview isMemberOfClass:viewType]) { 
      block(subview); 
     } 
    } 
+0

Estoy de acuerdo que debo utilizar en lugar de isMemberOfClass isKindOfClass. Sin embargo, el problema que estaba señalando es más de lo que podría pasar un bloque que toma un argumento de cualquier tipo. Donde el argumento debe ser del tipo UIView o derivado de él. Más específicamente debe ser de la misma clase que el viewType pasado al método. – Nils

+1

Luego tendrás que pasar la clase para bloquear también y verificar la seguridad de la clase dentro del bloque. La otra forma es usar 'typeof (class) subview' en su argumento de bloque, pero eso hará que su método dependa de alguna variable externa. –

+0

Eso no suena muy elegante. Entonces, ¿no cambiarías nada en el método anterior? – Nils

Cuestiones relacionadas