如何在Swift中弹出特定的View Controller

我使用下面的Objective-C代码弹出一个特定的ViewController

 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; } } 

我怎么能在Swift中做到这一点?

请尝试以下代码:

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

对于Swift 3

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

我更喜欢通用的方法来做到这一点。

我有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 } } } } 

假设我在导航堆栈中实例化了一个FOHomeVC类(谁是UIViewController)。

所以我会在我的代码中执行此操作:

 self.navigationController?.backToViewController(FOHomeVC.self) 

Swift 4.0

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

这是完美的。

请使用以下代码获取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) } } 

我已经为UINavigationController添加了一个扩展,它可以帮助您查找该控制器是否存在于导航堆栈中。 如果是,那么它将弹出到该控制器,否则你传递新控制器推送pushController参数。

 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) } } } 

最新的迅速

  @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) } } } }