78 votes

Comment identifier le contrôleur de vue précédent dans la pile de navigation

Je dispose de deux navigationcontrollers l'un avec RootViewController A et l'autre avec RootViewController B.

Je suis capable de pousser ViewController C sur la pile de navigation de A ou B.

Question : Lorsque je suis dans ViewController C, comment puis-je savoir si je suis dans la pile appartenant à A ou à B ?

106voto

jburns20 Points 1254

Vous pourriez utiliser le UINavigationController 's viewControllers propriété :

@property(nonatomic, copy) NSArray *viewControllers

Discussion : Le contrôleur de la vue de base est à l'indice 0 dans le tableau, le contrôleur de la vue arrière est à l'indice n-2, et le contrôleur du haut est à l'indice n-1, où n est le nombre d'éléments dans le tableau.

https://developer.apple.com/documentation/uikit/uinavigationcontroller

Vous pouvez l'utiliser pour tester si le contrôleur de vue racine (celui qui se trouve à l'indice 0 du tableau) est le contrôleur de vue A ou B.

102voto

George P Points 820

Voici l'implémentation de la réponse acceptée :

- (UIViewController *)backViewController
{
    NSInteger numberOfViewControllers = self.navigationController.viewControllers.count;

    if (numberOfViewControllers < 2)
        return nil;
    else
        return [self.navigationController.viewControllers objectAtIndex:numberOfViewControllers - 2];
}

28voto

Chris Points 2012
- (UIViewController *)backViewController
{
    NSInteger myIndex = [self.navigationController.viewControllers indexOfObject:self];

    if ( myIndex != 0 && myIndex != NSNotFound ) {
        return [self.navigationController.viewControllers objectAtIndex:myIndex-1];
    } else {
        return nil;
    }
}

11voto

tjklemz Points 671

Une mise en œuvre plus générale de la réponse acceptée :

- (UIViewController *)backViewController {
    NSArray * stack = self.navigationController.viewControllers;

    for (int i=stack.count-1; i > 0; --i)
        if (stack[i] == self)
            return stack[i-1];

    return nil;
}

Cela renverra le "back view controller" correct, quel que soit l'endroit où se trouve la classe actuelle dans la pile de navigation.

3voto

Alex Reynolds Points 45039

Accéder à la n-2 de l'élément viewControllers pour accéder au contrôleur de vue parent.

Une fois que vous avez cette instance, vous pouvez vérifier son type en enregistrant ce qui sort de la fonction NSStringFromClass() fonction. Ou bien vous pouvez conserver des static const dans les contrôleurs A et B, et une fonction getter qui imprime la chaîne de caractères.

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