50 votes

Exception "Pousser la même instance de contrôleur de vue plus d'une fois n'est pas supporté".

J'utilise le code suivant pour récupérer des messages et les placer dans ma boîte de réception.

MyInboxVC *inboxVC=[MyInboxVC get ];
//upload all the pending messages
UINavigationController *devNavController=[[MyappMgr get]getDeveloperNavigationController ];

[devNavController pushViewController:inboxVC animated:YES];
[devNavController setNavigationBarHidden:NO];

Je reçois l'exception

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Pushing the same view controller instance more than once is not supported (<MyInboxVC: 0x1452a0>)'

Qu'est-ce que cela signifie ? Qu'est-ce que je fais de mal ?

74voto

Melvin Points 1228

Je crois que lorsque vous faites certaines actions très rapidement, cela peut aussi arriver. J'ai construit quelque chose comme ça :

if(![self.navigationController.topViewController isKindOfClass:[YOURCLASS class]]) {

0 votes

J'ai rencontré le même problème dans une application très simple. Ceci l'a résolu pour moi.

9 votes

J'ai fait cette vérification mais l'exception existe toujours. Lorsque la deuxième poussée se produit, le topViewController n'a pas encore changé. Si je pousse sans animation, cela fonctionne. Quelqu'un peut-il m'aider ?

18voto

brian.clear Points 2424

Tout d'abord, gérez le crash pour qu'il ne tue pas votre application :

@try {
    [self.navController pushViewController:viewController animated:NO];
} @catch (NSException * e) {
    NSLog(@"Exception: %@", e);
} @finally {
    //NSLog(@"finally");
}

Si vous obtenez l'erreur, utilisez popTo.

- (void)pushViewController:(UIViewController *)viewController {
  if (viewController) {
    @try {
        [self.navController pushViewController:viewController animated:NO];
    } @catch (NSException * ex) {
        //“Pushing the same view controller instance more than once is not supported” 
        //NSInvalidArgumentException
        NSLog(@"Exception: [%@]:%@",[ex  class], ex );
        NSLog(@"ex.name:'%@'", ex.name);
        NSLog(@"ex.reason:'%@'", ex.reason);
        //Full error includes class pointer address so only care if it starts with this error
        NSRange range = [ex.reason rangeOfString:@"Pushing the same view controller instance more than once is not supported"];

        if ([ex.name isEqualToString:@"NSInvalidArgumentException"] &&
           range.location != NSNotFound) {
            //view controller already exists in the stack - just pop back to it
            [self.navController popToViewController:viewController animated:NO];
        } else {
            NSLog(@"ERROR:UNHANDLED EXCEPTION TYPE:%@", ex);
        }
    } @finally {
        //NSLog(@"finally");
    }
  } else {
    NSLog(@"ERROR:pushViewController: viewController is nil");
  }
}

27 votes

Il s'agit de "soigner" le symptôme et non la cause sous-jacente.

1 votes

J'ai le même problème, j'ai essayé d'ajouter un bloc try, catch mais il ne va jamais dans le bloc catch. Est-ce que quelque chose m'échappe ?

8voto

MarkPowell Points 11394

Cela signifie que le ViewController renvoyé par [MyInboxVC get] est déjà dans la pile de navigation de devNavController . Vous ne pouvez pas ajouter plusieurs fois le même objet à la pile.

Apparemment, vous avez déjà un MyInboxVC poussé plus tôt. Assurez-vous que vous l'avez poussé quand il n'était plus nécessaire.

C'est la réponse "qu'est-ce que ça veut dire", mais je n'ai pas assez d'informations pour savoir ce que vous devez faire pour le réparer.

Je pense que votre pile de navigation est plus grande que prévu, ce qui signifie que vous ne sautez pas aussi souvent que vous le devriez.

6voto

micnguyen Points 125

Faites-vous cela dans le cadre d'un enchaînement ? Si c'est le cas, il n'est pas nécessaire de pousser un VC sur votre contrôleur de navigation car le segue le fera déjà. C'est la raison de votre erreur : vous poussez un VC qui se trouve déjà sur la pile du NavController.

5voto

HDA Points 2590

Cela signifie que vous repoussez le même objet viewcontroller dans la pile alors qu'il s'y trouve déjà.

[self.navigationController pushViewController:viewControllerObj animated:NO];

[self.navigationController pushViewController:viewControllerObj animated:NO];

vérifiez si vous poussez à l'intérieur d'une boucle ou si vous avez accidentellement placé le code plus d'une fois

1 votes

À l'intérieur de la boucle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X