2010-11-30 23 views
0

J'ai une vue qui agit comme arrière-plan (gris clair 0,5 alpha) pour une autre vue d'alerte personnalisée.Masquer la sous-vue du contrôleur de vue différent

Lorsque l'utilisateur appuie sur le bouton OK de l'alerte personnalisée, je souhaite également masquer l'alerte personnalisée et la vue d'arrière-plan.

Les deux vues sont subviews du même superview ...

Je le fais dans la méthode buttonTapped: pour cacher les points de vue, et il fonctionne pour la première tentative, mais à partir de la deuxième fois en avant, les vues de fond jamais rejeter ... les alertes se cachent correctement à chaque fois.

[UIView animateWithDuration:0.5f animations:^{ 
    self.view.alpha=0.0f; //hide alert 
    [self.view.superview viewWithTag:1].alpha=0.0f; //hide background  
}]; 

Ils sont ajoutés comme subviews, comme suit:

ResultDialogController *dialogController = [[[ResultDialogController alloc] initWithNibName:@"ResultDialogController_" bundle:nil] retain]; 
ResultBackgroundViewController *bgViewController = [[[ResultBackgroundViewController alloc] initWithNibName:@"ResultView" bundle:nil] retain]; 

dialogController.view.alpha=0; 
bgViewController.view.alpha=0; 
bgViewController.view.tag=1; 

[UIView animateWithDuration:0.5f animations:^{ 
    bgViewController.view.alpha=0.5f;          
    dialogController.view.alpha=1.0f; 
    }]; 

[self.view addSubview:bgViewController.view]; 
[self.view addSubview:dialogController.view]; 
[dialogController release]; 
[bgViewController release]; 

Comment puis-je rejeter toujours la vue d'arrière-plan?

Merci

Répondre

1

Vous ne semblez pas supprimer les vues, vous venez de rendre l'invisible en mettant l'alpha à zéro. Ainsi, chaque fois que vous appelez votre deuxième exemple de code, vous allez ajouter une nouvelle version de la vue d'arrière-plan et de la vue du dialogue à self.view. Au deuxième appel, vous aurez deux vues en arrière-plan, à la fois avec tag = 1 et votre première vue d'arrière-plan de l'appel sera [self.view.superview viewWithTag:1], ce qui explique pourquoi votre nouvelle vue d'arrière-plan n'est pas invisible. Mais ce n'est pas tout, vous avez également une fuite de mémoire pour ResultDialogController et ResultBackgroundViewController. L'appel au retain n'est pas nécessaire lorsque vous appelez initWithNibName:bundle:. Peut-être que vous faites cela parce que vous avez planté lorsque vous avez libéré les contrôleurs?

Ce que vous devez faire est de créer des ivars et des propriétés pour vos contrôleurs.

@property (nonatomic, retain) ResultDialogController *resultController; 
@property (nonatomic, retain) ResultBackgroundController *backgroundController; 

Ensuite, en montrant les contrôleurs que vous pouvez faire quelque chose comme:

ResultDialogController *dialogController = [[ResultDialogController alloc] initWithNibName:@"ResultDialogController_" bundle:nil]; 
self.dialogController = dialogController; 

ResultBackgroundViewController *bgViewController = [[ResultBackgroundViewController alloc] initWithNibName:@"ResultView" bundle:nil]; 
self.backgroundController = bgViewController; 

// do the same as before 

Puis, en buttonTapped: vous:

[UIView animateWithDuration:0.5f 
    animations: ^{ 
     self.dialogController.view.alpha = 0; 
     self.backgroundController.view.alpha = 0; 
    } 
    completion: ^(BOOL finished){ 
     [self.dialogController.view removeFromSuperview]; 
     [self.backgroundController.view removeFromSuperview]; 
    } 
]; 

Et pour couronner le tout, ne pas oublier de libérer le contrôleur ivars en dealloc.

+0

Merci beaucoup, quelques modifications cependant ... après votre 'animateWithDuration: 0.5f' vous avez le mot' duration' qui ne devrait pas être là. Le gestionnaire de bloc d'achèvement doit également être 'achèvement:^(BOOL terminé) {' – joec

+0

De rien. J'espère que cela aide. Et mise à jour post. –

0

Vous pouvez les masquer en définissant la propriété HIDE pour les vues pour être vrai.