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

Mah*_*iya 28 uiviewcontroller ios swift

我使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Moh*_*hit 80

请尝试以下代码:

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

  • 如果我当前的视图控制器是模型怎么办? (2认同)

Mus*_*ari 30

对于Swift 3

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


Ash*_*shu 23

Swift 4.0

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

这是完美的.


Pab*_*loR 14

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

self.navigationController?.backToViewController(FOHomeVC.self)
Run Code Online (Sandbox Code Playgroud)


Par*_*oja 6

我添加了一个扩展来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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Pra*_*nit 6

斯威夫特 4 / 斯威夫特 5

 for controller in self.navigationController!.viewControllers as Array {
            if controller.isKind(of: HomeViewController.self) {
                self.navigationController!.popToViewController(controller, animated: true)
                break
            }
        }
Run Code Online (Sandbox Code Playgroud)


bud*_*ino 5

迅捷5

弹出特定类的最新实例,例如SomeViewController

navigationController?.popToViewController(ofClass: SomeViewController.self)
Run Code Online (Sandbox Code Playgroud)

但是您需要添加以下UINavigationController扩展名:

extension UINavigationController {
  func popToViewController(ofClass: AnyClass, animated: Bool = true) {
    if let vc = viewControllers.last(where: { $0.isKind(of: ofClass) }) {
      popToViewController(vc, animated: animated)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 迄今为止最快的答案5 (3认同)

d4R*_*4Rk 5

我更喜欢“真正通用”且更实用的方法。

所以我想出了以下UINavigationController扩展功能。您还可以将第一个函数用于其他任何用途,只需访问导航堆栈中的特定 VC 即可。


扩展

extension UINavigationController {
    func getViewController<T: UIViewController>(of type: T.Type) -> UIViewController? {
        return self.viewControllers.first(where: { $0 is T })
    }

    func popToViewController<T: UIViewController>(of type: T.Type, animated: Bool) {
        guard let viewController = self.getViewController(of: type) else { return }
        self.popToViewController(viewController, animated: animated)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

self.navigationController?.popToViewController(of: YourViewController.self, animated: true)
Run Code Online (Sandbox Code Playgroud)



这至少应该在 Swift 4 和 5 中有效。