[Xcode] Problème popViewController

lundi 29 février 2016

J’ai été confronté a un problème de viewController dans une navigationViewController après un appel à un webservice via RestKit. En effet, j’ai un formulaire en deux étapes, après ces deux écrans, je fais appel à un webservice pour sauver le tout mais bien entendu, il est possible que le webservice retourne une erreur. Dans ce cas là, j’utilise une alertview qui se charge de prévenir l’utilisateur qu’il y a eu un soucis avec le webservice et j’affiche son message de retour. Bien entendu, dans ce cas-ci l’utilisateur doit être redirigé vers la première partie du formulaire. Il faut donc faire un back. J’ai donc voulu utiliser la méthode popViewController de UINavigationController dans une méthode avec un argument de type block et malheureusement, impossible de retourner vers l’écran précédent.

En effet, mon erreur était de ne pas attendre que l’utilisateur ait cliqué sur le bouton ok de mon UIalertviewController avant de rediriger vers la page précédente.

Voici comment je m’y suis pris:

[[customerManager sharedManager]createUpdateCustomer:self.info block:^(id obj){
            [self.view hideActivityView];
            if(![obj message]){
                NSLog(@"creatUpdatecustomer OK");
                UCHEndViewController *view = [[UCHEndViewController alloc] init];
                view.message = NSLocalizedStringFromTable(@"end_description",language, @"");
                [[Global sharedInstance] startTransitionPage:self.navigationController.view];
                [self.navigationController pushViewController:view animated:NO];
                [[Global sharedInstance] stopTransitionPage];
            }else{
                [self displayAlertwithTitle:NSLocalizedStringFromTable(@"error", language, @"") Message:[obj message]];
                NSLog(@"[WEBSERVICE-ERROR] creatUpdatecustomer message:%@",[obj message]);
            }
        }];

La fonction createUpdateCustomer de customerManager est une fonction qui fait l’appel via restkit pour mettre à jour les données d’un customer. Si le webservice retourne une valeur dans la propriété message c’est qu’il y a un soucis, sinon l’update c’est déroulé correctement.

-(void) displayAlertwithTitle:(NSString*)title Message:(NSString *)msg{
    UIViewController *rootVC = [[(UCHAppDelegate *) [[UIApplication sharedApplication] delegate] window] rootViewController];
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        [self.navigationController popViewControllerAnimated:NO];
    }];
    [alertController addAction:ok];
    [rootVC presentViewController:alertController animated:YES completion:nil];
}

Donc ma solution a été de mettre une action lorsque l’utilisateur clique sur le bouton OK de mon uialertview de faire le popViewController et non directement avant même que l’utilisateur n’ait cliqué sur le bouton OK!

Voici le message d’alerte dans les logs que vous pouvez rencontrer si vous n’attendez pas que l’utilisateur ait cliqué sur le bouton OK: popViewControllerAnimated: called on while an existing transition or presentation is occurring; the navigation stack will not be updated.

Tags: popViewController , UINavigationController , Xcode