Итерация по всем 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
. Тип, используемый здесь, должен быть, конечно, таким же, как и первый аргумент. Однако до сих пор я не понял, как сделать этот тип безопасным.
Я согласен с тем, что я должен использовать isMemberOfClass вместо isKindOfClass. Однако проблема, на которую я указывала, - это более того, что я могу передать блок, который принимает аргумент любого типа. Где аргумент должен иметь вид UIView или получен из него. Более конкретно, он должен быть того же класса, что и viewType, переданного методу. – Nils
Затем вам придется пройти класс, чтобы заблокировать его, и проверить безопасность класса внутри блока. Другой способ - использовать 'typeof (class) subview' в вашем блочном аргументе, но это сделает ваш метод зависимым от некоторой внешней переменной. –
Это звучит не очень элегантно. Значит, вы ничего не измените по методу выше? – Nils