web-dev-qa-db-fra.com

Comment puis-je afficher un contrôleur de vue spécifique dans Swift?

J'ai utilisé le code Objective-C ci-dessous pour faire apparaître une ViewController spécifique.

for (UIViewController *controller in self.navigationController.viewControllers) {
    if ([controller isKindOfClass:[AnOldViewController class]]) { 
        //Do not forget to import AnOldViewController.h
        [self.navigationController popToViewController:controller
                                              animated:YES];
        break;
    }
}

Comment puis-je faire cela dans Swift?

15
Mahesh Cheliya

Essayez le code suivant:

for controller in self.navigationController!.viewControllers as Array {
    if controller.isKind(of: ViewController) {
        self.navigationController!.popToViewController(controller, animated: true)
        break
    }
}
59
Mohit

Pour Swift 3  

let viewControllers: [UIViewController] = self.navigationController!.viewControllers
for aViewController in viewControllers {
    if aViewController is YourViewController {
        self.navigationController!.popToViewController(aViewController, animated: true)
    }
}
27

Swift 4.0

for controller in self.navigationController!.viewControllers as Array {
        if controller.isKind(of: DashboardVC.self) {
            _ =  self.navigationController!.popToViewController(controller, animated: true)
            break
        }
    }

Cela fonctionne parfaitement.

14
Ashu

Je préfère une façon générique de le faire.

J'ai cette extension pour le UINavigationController:

extension UINavigationController {

   func backToViewController(vc: Any) {
      // iterate to find the type of vc
      for element in viewControllers as Array {
         if "\(element.dynamicType).Type" == "\(vc.dynamicType)" {
            self.popToViewController(element, animated: true)
            break
         }
      }
   }

}

Disons que j'ai une classe FOHomeVC (qui est un UIViewController) instanciée dans la pile de navigation.

Donc, je le ferais dans mon code:

self.navigationController?.backToViewController(FOHomeVC.self)
11
PabloR

Recherchez votre contrôleur de vue à partir de la pile de navigation et affichez-le s'il existe. 

for vc in self.navigationController!.viewControllers {
    if let myViewCont = vc as? VCName 
    {
        self.navigationController?.popToViewController(myViewCont, animated: true)
    }
}
3
Chinju James

J'ai ajouté une extension à UINavigationController qui vous aide à déterminer si ce contrôleur existe dans la pile de navigation. Si oui, il sera affiché sur ce contrôleur ou vous transmettez le nouveau contrôleur à Push avec pushController param. 

extension UINavigationController {

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

    func popPushToVC(ofKind kind: AnyClass, pushController: UIViewController) {
        if containsViewController(ofKind: kind) {
            for controller in self.viewControllers {
                if controller.isKind(of: kind) {
                    popToViewController(controller, animated: true)
                    break
                }
            }
        } else {
            pushViewController(pushController, animated: true)
        }
    }
}
3
Parth Adroja

Dans la dernière Swift 

   @IBAction func popToConversationsVC(_ sender: UIButton) {
        if (self.navigationController != nil) {
            for vc in  self.navigationController!.viewControllers {
                if vc is ConversationsVC {
                     self.navigationController?.popToViewController(vc, animated: false)
                }
            }
            }
    }
2

Veuillez utiliser le code ci-dessous pour Swift 3.0:

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

for aViewController:UIViewController in viewControllers {
            if aViewController.isKind(of: YourViewController.self) {
                _ = self.navigationController?.popToViewController(aViewController, animated: true)
            }
        }
1
urvashi bhagat

Swift 4  

 for controller in self.navigationController!.viewControllers as Array {
            if controller.isKind(of: HomeViewController.self) {
                self.navigationController!.popToViewController(controller, animated: true)
                break
            }
        }
0
Pranit