2011-01-14 6 views
1

1つのUIViewで '.tags'を使用してサブビューを検索することに関する質問があります。foreachループでswitch文を削除する

for (UIView *viewObj in [self.view subviews]) 
{ 
    // want to find viewObject by its tag. 
    // but I heard for-switch or for-case paradigm are bad pattern design by WTF. 
    // there are total 9 of tags will be use for finding view object 
    switch (viewObj.tag) 
    { 
     case 0: 
     . 
     .. 
     ... 
    } 
} 

これを非スイッチまたは非if文にするにはどうすればよいですか?私はちょうど1つの配列に追加してそこからフェッチする必要がありますか?たとえば、必要なタグを持つビューを追加し、この配列からフェッチします。

ありがとうございます。

答えて

2

固定された数のビューになり、各ビューに実行する必要のあるさまざまなメソッドがある場合、ビューに直接アクセスできます。

UIView* someView = [self.view viewWithTag:0]; 
//Operations on view 0 


UIView* someOtherView = [self.view viewWithTag:1]; 
//Operations on view 1 

//... 
+0

はい、この方法はiPhoneで動作します。ありがとう –

3

あなたのコメントから、それは存在するアイテムの非常に有限のセットです - 9個のアイテム。それが静的であると予想される場合は、switch文で実際に間違っていることはありません。おそらく、機能的には、各スイッチを別の方法に分解することができます。つまり、あなたのアレイのアイデアに加えて、おそらくコマンドパターンが考慮すべき1つのアプローチになるでしょう。参考のために:あなたができるhttp://en.wikipedia.org/wiki/Command_pattern

+0

+1:コマンドパターン用。 –

+0

あなたは絶対に正しいですし、デザインパターンの改訂に感謝します。 –

+0

私は状況に応じて最も実用的なものを何でもしようとします –

1

一つのことは、あなたのsubviewsUIView sは、それぞれが同じプロトコルに準拠したことにより、同じタイプである必要があります。次に、それぞれをid<YourProtocol>にキャストし、それぞれUIView内で同じ方法を呼び出します。

0

シャンの答えに関数を分解して関数ポインタを配列に入れることができれば、少し簡単にすることも、新しい"Blocks"言語機能を使うこともできます。

0

新しいIBOutletタイプ、IBOutletCollectionがあります。これをNSArrayに使用し、IBでビューをそのコンセントに追加することができます。実行時には、それらはすべて配列(順序付けられていない)に入れられます。

あなたが望む特定のものを取得するには、viewDidLoadですべてのNSArrayエントリをタグ値によってキー設定された辞書にマップし、次に「objectForKey」を使用してそれらを取得することができます。

関連する問題