0

カスタム UIButton サブクラスがあります。実際にそれらの多く。

そのため、for-in ループで containerView.subviews 内のすべてを列挙したいと考えました。しかし、次のように実行すると:

for (CustomButton *button in self.containerView.subviews)
{
    NSLog(@"%@", button.class);
}

...反復される最初のオブジェクトは、サブビューでもある UIImageView です。for-in ループで必要なクラスしか得られないのはなぜですか?

4

2 に答える 2

5

配列内のすべてのオブジェクトを反復処理し、CustomButton クラスにキャストしようとします。フィルタリングを行う必要があります。

for (CustomButton *button in self.containerView.subview)
{
    if ([button isKindOfClass: [CustomButton class]])
       NSLog(@"%@", button.class);
}
于 2013-03-28T15:15:18.687 に答える
2

for-in ループは、本来の目的を正確に実行します。コンテナビュー(セルまたはスクロールビューの?)のすべてのサブビューを反復処理します。

それらを再帰的に処理して、サブビューのすべてのサブビューを同じ方法で処理できます。少なくともそれは私がすることです。

次に、(isKindOfClass を使用して) クラス タイプを確認し、関心のあるものだけを処理します。

ボタンに含まれるサブビューの数に驚かれることでしょう。

編集: あなたの質問には、これまで取り上げていない側面がもう 1 つあります。for-in ループの「差別化」を求めます。それはループの側面ではありません。for-in simple は、コンテナのすべての要素を反復処理します。それは、配列、辞書、またはセットの場合があります。サンプルでは、​​各オブジェクトを CustomButton タイプのオブジェクトに型キャストするだけです。そうすることで、カスタム ボタンに固有のプロパティまたはメソッドにアクセスした場合でも、コンパイラはエラーなしでパスします。その後、実行時に例外がスローされます。

于 2013-03-28T15:16:37.020 に答える