在Swift中的Nav Controller中的Pop 2视图控制器

问题描述:

我发现了许多方法来在使用对象C的导航控制器中弹出2个视图控制器,但是当我尝试将它切换到swift时,它似乎不工作。在Swift中的Nav Controller中的Pop 2视图控制器

回到视图控制器的最佳方法是什么? 任何指导,将不胜感激 感谢

+0

大同小异作为ObjC:复制'UINavigationController'的'viewControllers'阵列,删除该数组中的最后两个元素,并设置'viewControllers'到修改后的数组。还有一个'setViewControllers(_:animated:)'来包含流行动画。 – fluidsonic 2014-10-01 01:20:30

+3

或者,您可以在'viewControllers'数组中找到第二个视图控制器,然后使用'popToViewController'来避免覆盖整个视图控制器堆栈。 – 2014-10-01 01:24:20

+0

您可以通过他的类弹出到控制器http://stackoverflow.com/questions/30003814/how-can-i-pop-specific-view-controller-in-swift/40314079#40314079 – PabloR 2016-10-28 22:40:26

扩大对我的评论,发现viewControllers数组中的倒数第二个视图控制器,然后使用popToViewController以避免覆盖整个视图控制器堆栈。

实施例(假定导航控制器具有大于1个的视图控制器):

func backTwo() { 
    let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController] 
    self.navigationController!.popToViewController(viewControllers[viewControllers.count - 3], animated: true) 
} 
+0

这工作非常好,谢谢!后续问题:当它弹出到正确的视图控制器时,它首先将横向视图变为纵向,然后弹出。有没有办法让它在弹出之前旋转横向视图? – candidaMan 2014-10-02 16:00:05

+5

哇谢谢亚伦,这工作完美!奇怪的是,我不得不把'viewControllers.count - 3'弹回两个步骤,但现在奇妙地工作! – 2015-02-01 14:57:58

可以动态弹出多个viewcontrollers在(SWIFT 2.0)

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

         for aviewcontroller : UIViewController in allViewController 
         { 
          if aviewcontroller .isKindOfClass(YourDestinationViewControllerName) 
          { 
          self.navigationController?.popToViewController(aviewcontroller, animated: true) 
          } 
         } 

user5320485答案在swift3

let viewControllers = self.navigationController!.viewControllers as [UIViewController]; 
for aViewController:UIViewController in viewControllers { 
    if aViewController.isKind(of: AdCreateViewController.self) { 
     _ = self.navigationController?.popToViewController(aViewController, animated: true) 
    } 
} 

我写了一个扩展的UIViewController(SWIFT 3+就绪)

您可以使用这样的:

/// pop back n viewcontroller 
func popBack(_ nb: Int) { 
    if let viewControllers: [UIViewController] = self.navigationController?.viewControllers { 
     guard viewControllers.count < nb else { 
      self.navigationController?.popToViewController(viewControllers[viewControllers.count - nb], animated: true) 
      return 
     } 
    } 
} 

用法:

self.popBack(3) 

奖金驳回到特定的ViewController

/// pop back to specific viewcontroller 
func popBack<T: UIViewController>(toControllerType: T.Type) { 
    if var viewControllers: [UIViewController] = self.navigationController?.viewControllers { 
     viewControllers = viewControllers.reversed() 
     for currentViewController in viewControllers { 
      if currentViewController .isKind(of: toControllerType) { 
       self.navigationController?.popToViewController(currentViewController, animated: true) 
       break 
      } 
     } 
    } 
} 

用法:

self.popBack(toControllerType: MyViewController.self)