web-dev-qa-db-fra.com

Étrange avertissement renvoyant le contrôleur de vue modale

Je travaille sur iOS 6. Mon application dispose d'un contrôleur de navigation standard avec un CustomViewController intégré. Dans ce contrôleur, je crée une vue modale comme celle-ci:

-(IBAction)presentModalList:(id)sender {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    StationsListViewController *list = [storyboard instantiateViewControllerWithIdentifier:@"StationsListViewController"];
    [list setStationsData: [self.stationsData allValues]];
    [self presentModalViewController:list animated:YES];
}

Le contrôleur modal s’affiche parfaitement, mais le renvoi entraîne un avertissement. La méthode de renvoi dans ce contrôleur est la suivante:

-(IBAction)backToMap
{
    [self dismissModalViewControllerAnimated:YES];
}

L'avertissement généré est Warning: 

Tentative de rejeter du contrôleur de vue <UINavigationController: 0x1ed91620> pendant la présentation ou de le rejeter!

Des indices à ce sujet?

Merci

19
Sparviero

Cibler iOS6, voici ce qui a fonctionné pour moi:

if (![self.presentedViewController isBeingDismissed]) 
    [self.presentedViewController dismissViewControllerAnimated:YES
                                                     completion:nil];
0
Yoni Hassin

Je me rends compte que c'est une réponse tardive, mais peut-être que cela aidera quelqu'un d'autre à la recherche d'une solution, voici ce que j'ai fait:

-(IBAction)backToMap
{
    if (![[self modalViewController] isBeingDismissed])
        [self dismissModalViewControllerAnimated:YES];
}

Pour moi, j'ai découvert que cette ligne de code était appelée plusieurs fois. Je ne pouvais pas savoir pourquoi, donc c'était la solution la plus simple.

28
JDx

Merci JDx de m'avoir mis sur la bonne voie. Je l'ai adapté pour former cette solution, qui supprimera l'avertissement sans utiliser de fonctions obsolètes dans iOS 6:

-(IBAction)backToMap
{
    if (![self.presentedViewController isBeingDismissed]) {
        [self dismissViewControllerAnimated:YES completion:^{}];
    }
}
14
Kyle Clegg

J'ai trouvé cette approche peu fiable - disons un cas sur cinq, mais l'erreur serait encore visible.

Ma solution consistait à utiliser le bloc d'achèvement pour définir un indicateur qui contrôle si le renvoi est sécurisé ou non. Ainsi, vous n'avez pas besoin de vérifier si la vue est rejetée. 

-(IBAction)presentModalView:(id)sender {
    :
    self.canDismiss = NO;
    [self presentViewController:aVC animated:YES completion:^{ 
      self.canDismiss = YES; 
     }];
    :
}

Dans le morceau de code où le licenciement a lieu, vérifiez simplement le drapeau:

-(void)dismisser {
    :
    if (self.canDismiss) {
      [self dismissViewControllerAnimated:YES completion:nil];
    }
    :
}

Hé hop, plus d'erreurs!

0
JAWZ apps

Vous pouvez faire ce que vous voulez après l’achèvement de la méthode de licenciement en tant que:

-(IBAction)backToMap
{
    [self dismissViewControllerAnimated:YES
                             completion:^{
                                 //Do something here
                             }];
}
0
giuseppe