2011-10-26 9 views
3

これは実際の問題ではありません。 UIButtonにいくつかのサブビューを追加しています(各ボタンにはタグがあります).4または5のサブビューがあることがわかります。 だから、私はいくつかのサブビュー(この場合は、特に4番目と5番目)を削除したいとき:5ない複数あるので、安全タグ付きサブビューを削除する

int cnt=[[(UIView *)[self.scrollView viewWithTag:index] subviews] count]; 
    if (cnt==4) { 
     [[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:3] removeFromSuperview]; 
    } 
    if (cnt==5) { 
     [[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:3] removeFromSuperview]; 
    //[[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:4] removeFromSuperview]; <-- this crash 
     [[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:3] removeFromSuperview]; 

    } 

コメント行はもちろん、実行することができないが、しかし4サブビュー。 したがって、私は同じインデックス上で2回指しているビューを削除する必要があります。 削除するのが安全な方法かどうかを知りたいのですが、最後のビューが配列[[self.scrollView viewWithTag:index] subviews]の1つ下の位置に移動されていることを確認したいと思います。

希望です。 おかげ

答えて

4

は、私はむしろ、このようなものを使用したい:リストからオブジェクトを削除するとき

for(int i=cnt-1;i>=3;i--) 
{ 
    [[[(UIView *)[self.scrollView viewWithTag:index] subviews] objectAtIndex:i] removeFromSuperview]; 
} 

は通常、最も安全な方法は、最後に開始することです。このようにして再編成するかどうかは問題ではありません。

8

あなたが削除したいビューのタグを知っている場合は、これを行うための安全な方法がある:ここでは

[[parentView viewWithTag:tag] removeFromSuperview]; 

あなたが自分自身を削除するために、子ビューを尋ねるのではなく、親ビューを求めています間違っていると思われる順序に基づいて子供を取り除く。

+0

また、特定のタグを持つビューが存在しない場合は、nilを返すだけで、好きなメソッドを呼び出すことができます。 – jrturton

+0

応答ありがとう、私はこれを知っているが、子サブビューにタグがない、私はちょうどそこに4または5サブビューがあることを知っています。 – Mat

+0

あなたの子供のビューへのアクセスは、私にとって本当に壊れやすいものです。それらにタグを付けるか、それらを識別する他の方法がある(例えば、インスタンス変数や辞書の中でそれらへの参照を保持するなど) –

関連する問題