web-dev-qa-db-fra.com

xcode Suppression de certaines sous-vues de la vue

Salutations à tous,

Je suis un noob et j'essaie de résoudre ce problème depuis quelques jours. 

J'ajoute des images à une vue via UItouch. La vue contient un arrière-plan au-dessus duquel les nouvelles images sont ajoutées. Comment effacer les images que j'ajoute à partir de la sous-vue, sans me débarrasser de l'UIImage qui constitue l'arrière-plan. Toute aide est grandement appréciée. Merci d'avance.

voici le code:

- (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

Ce dont vous avez besoin, c'est d'un moyen de distinguer les objets UIImageView ajoutés de l'arrière-plan UIImageView. Je peux penser à cela de deux manières.

Approche 1: attribuer une valeur de balise spéciale aux objets UIImageView ajoutés

Chaque objet UIView a une propriété tag qui est simplement une valeur entière pouvant être utilisée pour identifier cette vue. Vous pouvez définir la valeur de balise de chaque vue ajoutée sur 7 comme suit:

myImage.tag = 7;

Ensuite, pour supprimer les vues ajoutées, vous pouvez parcourir toutes les sous-vues et ne supprimer que celles avec une valeur de balise de 7:

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

Approche 2: Mémoriser la vue d'arrière-plan

Une autre approche consiste à conserver une référence à la vue d'arrière-plan afin de pouvoir la distinguer des vues ajoutées. Créez une IBOutlet pour la UIImageView d'arrière-plan et affectez-la comme d'habitude dans Interface Builder. Ensuite, avant de supprimer une sous-vue, assurez-vous que ce n'est pas la vue en arrière-plan.

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

Un code plus rapide pour l'approche n ° 1 dans une seule ligne de code fonctionnelle:

self.view.subviews.filter({$0.tag == 7}).forEach({$0.removeFromSuperview()})
0
iLandes