web-dev-qa-db-ja.com

xcodeビューからいくつかのサブビューを削除する

みなさん、こんにちは。

私は初心者で、数日間これを乗り越えようとしています。

UItouchを介してビューに画像を追加しています。ビューには、新しい画像が追加される背景が含まれています。背景であるUIImageを削除せずに、サブビューから追加している画像をクリアするにはどうすればよいですか。どんな援助も大歓迎です。前もって感謝します。

コードは次のとおりです。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *) event { 
NSUInteger numTaps = [[touches anyObject] tapCount];

if (numTaps==2) {
    imageCounter.text =@"two taps registered";      

//__ remove images  
    UIView* subview;
    while ((subview = [[self.view subviews] lastObject]) != nil)
        [subview removeFromSuperview];

    return;

}else {

    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];
    CGRect myImageRect = CGRectMake((touchPoint.x -40), (touchPoint.y -45), 80.0f, 90.0f); 
    UIImageView *myImage = [[UIImageView alloc] initWithFrame:myImageRect];

    [myImage setImage:[UIImage imageNamed:@"pg6_dog_button.png"]];
     myImage.opaque = YES; // explicitly opaque for performance


    [self.view addSubview:myImage];
    [myImage release];

    [imagesArray addObject:myImage];

    NSNumber *arrayCount =[self.view.subviews count];
    viewArrayCount.text =[NSString stringWithFormat:@"%d",arrayCount];
    imageCount=imageCount++;
    imageCounter.text =[NSString stringWithFormat:@"%d",imageCount];

}

}

12
S. Naughton

必要なのは、追加されたUIImageViewオブジェクトを背景のUIImageViewから区別する方法です。これを行うには2つの方法が考えられます。

アプローチ1:追加されたUIImageViewオブジェクトに特別なタグ値を割り当てます

UIViewオブジェクトにはtagプロパティがあります。これは、そのビューを識別するために使用できる単なる整数値です。追加された各ビューのタグ値は、次のように7に設定できます。

myImage.tag = 7;

次に、追加されたビューを削除するには、すべてのサブビューをステップスルーして、タグ値が7のサブビューのみを削除します。

for (UIView *subview in [self.view subviews]) {
    if (subview.tag == 7) {
        [subview removeFromSuperview];
    }
}

アプローチ2:背景ビューを覚えておいてください

別のアプローチは、追加されたビューと区別できるように、背景ビューへの参照を保持することです。背景IBOutlet用にUIImageViewを作成し、InterfaceBuilderで通常の方法で割り当てます。次に、サブビューを削除する前に、それが背景ビューではないことを確認してください。

for (UIView *subview in [self.view subviews]) {
    if (subview != self.backgroundImageView) {
        [subview removeFromSuperview];
    }
}
28

たった1行のコードでアプローチ#1のより迅速なコード:

self.view.subviews.filter({$0.tag == 7}).forEach({$0.removeFromSuperview()})
0
Sébastien REMY