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?
Essayez le code suivant:
for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: ViewController) {
self.navigationController!.popToViewController(controller, animated: true)
break
}
}
Pour Swift 3
let viewControllers: [UIViewController] = self.navigationController!.viewControllers
for aViewController in viewControllers {
if aViewController is YourViewController {
self.navigationController!.popToViewController(aViewController, animated: true)
}
}
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.
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)
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)
}
}
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)
}
}
}
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)
}
}
}
}
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)
}
}
Swift 4
for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: HomeViewController.self) {
self.navigationController!.popToViewController(controller, animated: true)
break
}
}