web-dev-qa-db-fra.com

Comment faire apparaître le contrôleur de vue sur l'un des contrôleurs de vue précédents dans swift?

J'ai essayé de placer mon contrôleur de vue sur l'un des contrôleurs de vue précédents de ma pile de vues. Supposons que, il y a firstVC, secondVC, thirdVC et thirdVC viewcontrollers dans ma pile de vues. Le contrôleur de vue actuel est le quatrième et il existe une vue de table dans 4thVC. Si l'utilisateur supprime toutes les lignes de la table, je le dirigerai vers secondVC . J'ai eu l'idée de créer un autre contrôleur de navigation et de le présenter avec presentViewController command. Cependant, ce n'est pas une solution à mon problème. Parce que je pensais qu'un problème de navigation apparaît pour ce cas. Comment puis-je trouver la meilleure solution pour ce cas? 

Merci pour vos réponses, Cordialement

20
serhanaksut

Au lieu de faire un appel générique popViewControllerAnimated:, utilisez popToViewController:animated:. Vous pouvez détecter si l'utilisateur a supprimé toutes les lignes, auquel cas, procédez comme suit (sinon, ouvrez un contrôleur de vue):

let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];
self.navigationController!.popToViewController(viewControllers[viewControllers.count - 2], animated: true);
32
Aaron Wojnowski

Si vous souhaitez accéder à un contrôle de vue spécifique sans connaître le nombre de retours, vous pouvez utiliser ceci:

 let viewControllers: [UIViewController] = self.navigationController!.viewControllers as! [UIViewController];

        for aViewController in viewControllers {
            if(aViewController is ViewControllerYouWantToGoTo){
                 self.navigationController!.popToViewController(aViewController, animated: true);
            }
        }
15
BluGeni

Après beaucoup d'efforts, j'ai créé l'extension Swift de retour vers un contrôleur de vue particulier dans Swift 3.0.

extension UINavigationController {

    func backToViewController(viewController: Swift.AnyClass) {

            for element in viewControllers as Array {
                if element.isKind(of: viewController) {
                    self.popToViewController(element, animated: true)
                break
            }
        }
    }
}

Méthode d'appel:

   self.navigationController?.backToViewController(viewController: BarCodeScannerVC.self)
7
Arvind Kumar

Ici, vous pouvez le faire en recherchant le contrôleur dans la pile UINavigationController et à l'aide de la boucle for et en vérifiant la condition de votre contrôleur de choix. Si la condition est remplie, elle apparaîtra sur le contrôleur de destionation.

let viewControllersStack: [UIViewController] = self.navigationController!.viewControllers
      for firstViewcontroller in viewControllersStack
      {
           if firstViewcontroller is desireViewController
           {
                self.navigationController!.popToViewController(firstViewcontroller, animated: true)
           }
      }
0