2012-01-25 19 views
5

Powtórzenie wszystkich UIViews w subviews klasy, a następnie sprawdzenie typu w pętli przy użyciu isKindOfClass sprawiło, że mój kod wygląda na zbędny. Napisałem więc następującą metodę, która wykonuje blok dla każdego wydziału.Powtórz wszystkie subviews określonego typu

@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 

Blok przekazany do tej metody przyjmuje argument typu id. Typ użyty tutaj powinien być oczywiście taki sam jak przekazany jako pierwszy argument. Jednak do tej pory nie wymyśliłem sposobu, aby uczynić ten rodzaj bardziej bezpiecznym.

Odpowiedz

11

Spróbuj tak, powinno być wystarczająco bezpiecznie.

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

Zgadzam się, że powinienem użyć isMemberOfClass zamiast isKindOfClass. Jednak problem, na który wskazywałem, polega na tym, że mógłbym przekazać blok, który przyjmuje argument dowolnego rodzaju. Gdzie argument musi być rodzaju UIView lub pochodzi od niego. Dokładniej, musi to być ta sama klasa co typ viewType przekazany do metody. – Nils

+1

Następnie musisz przejść klasę, aby zablokować i sprawdzić bezpieczeństwo klasy w bloku. Innym sposobem jest użycie 'typeof (class) subview' w twoim bloku argument, ale to sprawi, że twoja metoda będzie zależna od jakiejś zewnętrznej zmiennej. –

+0

To nie brzmi zbyt elegancko. Więc nie zmienisz niczego w powyższej metodzie? – Nils

Powiązane problemy