2012-01-25 6 views
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の引数を取ります。ここで使用される型はもちろん、最初の引数として渡される型と同じでなければなりません。しかし、これまでのところ、私はより多くの型を安全にする方法を考え出していません。

答えて

11

このように試してください。十分安全なはずです。

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

isKindOfClassではなくisMemberOfClassを使用することに同意します。しかし、私が指摘していた問題は、どのタイプの引数も取るブロックを渡すことができるということです。引数は、種類がUIViewであるか、そこから派生している必要があります。具体的には、メソッドに渡されるviewTypeと同じクラスでなければなりません。 – Nils

+1

それからブロックするためにクラスを渡し、ブロック内のクラスの安全性をチェックする必要があります。もう1つの方法は、あなたのブロック引数に 'typeof(class)subview'を使うことですが、それはあなたのメソッドをいくつかの外部変数に依存させます。 –

+0

それは非常に優雅に聞こえません。上記の方法で何も変更しないでしょうか? – Nils

関連する問題