web-dev-qa-db-fra.com

Comment vérifier que viewcontroller est ajouté dans la pile ou non

J'ai deux contrôleurs de vue. J'ai navigué d'une vue à une autre en appuyant sur le bouton pour utiliser le code ci-dessous.

 *let secondViewController = self.storyboard!.instantiateViewControllerWithIdentifier("NotificationController") as! NotificationController

self.navigationController!.pushViewController(secondViewController, animated: true)*

Pour le dos, j'utilise le bouton barre sur le bouton barre, cliquez pour revenir en utilisant le code ci-dessous.

 self.navigationController?.popViewControllerAnimated(true)

Donc, mon problème est que si je passe d’une vue à une autre en permanence, cela s’ajoute à une pile. Je souhaite uniquement afficher une autre vue lorsqu'elle est déjà ajoutée à la pile pour ne plus l'ajouter.Il n'ajoute qu'une seule fois.

7
Gaurav Gupta

Pour vérifier si la pile navigation contient un type particulier de view controller, vous pouvez utiliser:

if let viewControllers = self.navigationController?.viewControllers
{
    if viewControllers.contains(where: {
        return $0 is YourViewController
    })
    {
        //Write your code here
    }
}

Pour supprimer un contrôleur particulier de la pile de navigation, vous devez modifier la pile de navigation.

Exemple:

    if var viewControllers = self.navigationController?.viewControllers
    {
        for controller in viewControllers
        {
            if controller is UIViewController
            {
                viewControllers.removeElement(controller)
                self.navigationController?.viewControllers = viewControllers
            }
        }
    }
14
PGDev

Pour Swift 4, vous pouvez utiliser

 if let viewControllers = self.navigationController?.viewControllers {
       for vc in viewControllers {
            if vc.isKind(of: YourViewController.classForCoder()) {
                 print("It is in stack")
                 //Your Process
            }
       }
 }
9
vp2698

Développer la réponse de PGDev pour Swift 4.1

Comment supprimer une sous-classe UIViewController spécifique de la pile UINavigationController:

/// Given 'nc' is a valid UINavigationController instance,
/// removes all instances of MyViewController from the stack

nc.viewControllers = nc.viewControllers.filter { !($0 is MyViewController) }

En le mettant comme une extension:

extension UINavigationController
{
    /// Given the kind of a (UIViewController subclass),
    /// removes any matching instances from self's
    /// viewControllers array.

    func removeAnyViewControllers(ofKind kind: AnyClass)
    {
        self.viewControllers = self.viewControllers.filter { !$0.isKind(of: kind)}
    }

    /// Given the kind of a (UIViewController subclass),
    /// returns true if self's viewControllers array contains at
    /// least one matching instance.

    func containsViewController(ofKind kind: AnyClass) -> Bool
    {
        return self.viewControllers.contains(where: { $0.isKind(of: kind) })
    }
}

Utilisation:

guard let nc = self.navigationController else { return }

let exists = nc.containsViewController(ofKind: MyViewController.self)

nc.removeAnyViewControllers(ofKind: MyViewController.self)

BTW, si quelqu'un sait comment contraindre 'kind' aux sous-classes de UIViewController, veuillez crier.

5
Womble

Voici le code pour le vérifier.

if let viewControllers = navigationController?.viewControllers {
    for viewController in viewControllers {
        // some process
        if viewController.isKindOfClass(ViewControllerClassName) {
            println("yes it is")
        }
    } 
}
2
Sivajee Battina

Vous pouvez vérifier avec ci-dessous code

Objectif c

NSArray * controllers = [self.navigationController viewControllers];

    for (int i = 0; i < [controllers count]; i++){

        UIViewController * controllerTest = [controllers objectAtIndex:i];

        if([controllerTest isKindOfClass:[YourController class]]){
            NSLog(@"Class is available");
        }

    }

Swift 3.0

if let viewControllers = self.navigationController?.viewControllers {
            for viewController in viewControllers {
                // some process
                if viewController.isKindOfClass(YourController) {
                    print("Class is available")
                }
            } 
        }
1
Abhishek Sharma

Et c'est parti.

Cette ligne vous donnera un tableau de UIViewControllers

self.navigationController?.viewControllers

Maintenant, ce que vous devez faire est de vérifier si votre viewControllerObject existe ou non?

En écrivant cette ligne 

if viewController.isKindOfClass(YourController){
}

et voici un code complet.

if let viewControllers = self.navigationController?.viewControllers {
            for viewController in viewControllers {

                if viewController.isKindOfClass(YourController) {
                    print("Your controller exist")
                }
       } 
}

Lorsque vous écrivez au-dessous de la ligne en revenant dans votre 'ViewControllerA', cela supprimera un ViewControllerB de la pile de navigation.

self.navigationController?.popViewControllerAnimated(true)

Il s’agit simplement d’une opération pop similaire à celle que nous effectuons avec stack et de navigationcontroller est une pile. 

Faites-moi savoir si vous avez des confusions.

1
Anil Kukadeja