遍历特定类型的所有子视图

5

在类的子视图中循环遍历所有UIView,然后在循环中使用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类型的参数。这里使用的类型当然应该与第一个参数传递的类型相同。但是到目前为止,我还没有找到一种使其更加类型安全的方式。

1个回答

11

尝试像这样做,应该足够安全。

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

我同意应该使用isMemberOfClass而不是isKindOfClass。然而,我指出的问题更多的是我可以传递一个带有任何类型参数的块。其中参数必须是UIView或派生自它的类型。更具体地说,它必须是与传递给方法的viewType相同的类。 - Nils
1
那么你还需要将类作为参数传递到块中,并在块内部检查类的安全性。另一种方法是在块参数中使用 typeof(class) subview,但这将使您的方法依赖于某些外部变量。 - Kyr Dunenkoff
这听起来不太优雅。那么你不会对上面的方法做任何改变吗? - Nils
不。到目前为止,你拥有的解决方案是最优雅和安全的。 - Kyr Dunenkoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接