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.
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
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. –
Eso no suena muy elegante. Entonces, ¿no cambiarías nada en el método anterior? – Nils