2016-05-17 11 views
1

を働いていない、私は以下のコードを使用して既存のビューから画像を削除しようとしています:removeFromSuperview UIImageViewは

-(void) deleteImage:(int)imageID{ 

//[self.imageArray removeObjectAtIndex:imageID]; 
//remove the image from the screen 
for (UIView* view in self.view.subviews) { 
    if ([view isKindOfClass:[UIImageView class]] && [view tag] == imageID) { 
     //could be a bug here with the re-Ordering of the array (could add a helper method to reset all the tags on screen when this is called 
     NSLog(@"view %@", view); 
     //[self.imageArray removeObjectAtIndex:imageID]; 
     [view removeFromSuperview]; 
    } 
    } 
} 

のNSLogは、次のように出力します

view <UIImageView: 0x18b8d7b0; frame = (0 0; 768 2016); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x18b8d890>> 

私が持っている問題はそのことですImageViewが表示されているように見えますが、ImageViewは削除されません。

+0

あなたは要件を詳しく教えてください。実際に 'imageView'自体を削除するか、単に' imageView'で表示される画像を消去する必要がありますか? – GoGreen

+0

@GoGreen imageView自体を削除する必要があります。 – jampez77

+0

スーパービューから削除する前にステートメントを記録しました。 for文の後にサブビューをループして、 'imageView'がまだ存在するかどうかを確認してください。また、これはサブビューを削除する理想的な方法ではありません。削除したいビューへの参照を、 'property'または'インスタンス変数 'として追加しておきます。この参照を使用して削除することができます。再度確認してください。 – GoGreen

答えて

1

ユーザーインターフェイスを変更しようとしているので、メインスレッドで実行する必要があります。したがって、次の操作を行いますので、コピー配列をいじる、すべての

dispatch_async(dispatch_get_main_queue(), ^{ 
    [view removeFromSuperview]; 
}); 
1

まず、あなたはそのサブビューのビューを要求したとき、あなたはサブビュー配列のコピーを取得し、あなたに何か良いを行いません。

第2に、原則として、列挙中にコレクションの変更を禁止する高速列挙を使用しているため、サブビューを削除しようとするとクラッシュする可能性があります。

最後に、ビューのサブビューを削除する正しい方法は、removeFromSuperviewメソッドを使用することです。これは、問題のイメージビューへの参照を保持する必要があることを意味します。

「View Hierarchyの管理」というUIViewセクションで提供されているメソッドを使用し、実際のサブビュー配列そのものを荒らさないようにする必要があります。これは潜在的にサブビュー階層を矛盾した状態にするためのレシピです。

関連する問題