2012-01-25 2 views
5

Итерация по всем UIViews в подзонах класса, а затем проверка типа в цикле с использованием isKindOfClass заставила мой код выглядеть излишним. Поэтому я написал следующий метод, который выполняет блок для каждого поднабора.Итерация по всем подзонам определенного типа

@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 

Блок прошел к этому методу принимает аргумент типа id. Тип, используемый здесь, должен быть, конечно, таким же, как и первый аргумент. Однако до сих пор я не понял, как сделать этот тип безопасным.

ответ

11

Попробуйте это, должно быть достаточно безопасным.

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

Я согласен с тем, что я должен использовать isMemberOfClass вместо isKindOfClass. Однако проблема, на которую я указывала, - это более того, что я могу передать блок, который принимает аргумент любого типа. Где аргумент должен иметь вид UIView или получен из него. Более конкретно, он должен быть того же класса, что и viewType, переданного методу. – Nils

+1

Затем вам придется пройти класс, чтобы заблокировать его, и проверить безопасность класса внутри блока. Другой способ - использовать 'typeof (class) subview' в вашем блочном аргументе, но это сделает ваш метод зависимым от некоторой внешней переменной. –

+0

Это звучит не очень элегантно. Значит, вы ничего не измените по методу выше? – Nils

Смежные вопросы