web-dev-qa-db-fra.com

Contrôleur de navigation popViewControllerAnimated: oui ne fonctionne pas comme prévu

J'utilise la ligne de code suivante:

[self.navigationController popViewControllerAnimated:YES];

Mais il ne se comporte pas dans ios 7 comme dans ios 6. Il arrive parfois que le contrôleur n'apparaisse pas lorsque nous appuyons sur le bouton de retour 2 à 3 fois de suite.
Cela entraîne un comportement brutal dans la barre de navigation et désalloue un contrôleur, mais affiche le même résultat sur ui.
Ainsi, lorsque nous appuyons sur quelque chose sur ce contrôleur, un crash se produit, car le contrôleur est déjà désalloué.

12
user3441955

Vérifiez si vous utilisez le code sur le thread d'interface utilisateur

8
cynistersix
[self.navigationController popToRootViewControllerAnimated:YES];

Cette méthode vous conduira à la racine de votre navigationController.

Vous pouvez vérifier votre hiérarchie viewController avec le code suivant.

    NSLog(@"%@",self.navigationController.viewControllers);
6
Sunny Shah

J'ai résolu ce problème de cette façon: 

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                                                                     UINavigationController * nav = tabbarControl.selectedViewController;
                                                                     [nav.viewControllers objectAtIndex:0];
[nav setViewControllers:@[[nav.viewControllers objectAtIndex:0]] animated:NO];
                                                                tabbarControl.selectedIndex = 0;
 });

Lorsque vous tardez une seconde, la vue sortira de l'interface utilisateur, puis de la pile de navigation, ce qui est le problème de l'animation en série.

4
user5672256

Je pense que cela devrait fonctionner sans dispatch_async ..__ Je suis arrivé au même problème, mais je dois connaître la raison.

Nous devrions vérifier si la scène actuelle est affectée à un nom de contrôleur de vue approprié dans le storyboard. (Inspecteur d'identité -> classe)

Si vous connectez une action de bouton au fichier m, puis insérez le nom du contrôleur de vue, cela ne fonctionne pas.

Donc, vous devez supprimer la connexion et insérer le nom de contrôleur de vue approprié, puis vous devez reconnecter l'action au fichier m. 

0
David K. Lee

J'ai eu le même problème sur iOS 8.

J'ai résolu le problème en sous-classant UINavigationController et en ajoutant ce code:

- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.delegate = self;
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated
{
    [[UIApplication sharedApplication] beginIgnoringInteractionEvents];
    return [super popViewControllerAnimated:animated];
}

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
{
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}

En gros, je bloque toutes les interactions utilisateur lors de l'animation pop. Je sais que c'est une solution sale, mais c'est la seule solution qui résout le problème.

0
Dzamir

Essayez ce code pour afficher un contrôleur de vue à partir de la pile de navigation.

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count -2] animated:YES];
0
Macrosoft-Dev