2014-10-01 15 views
12

我發現了許多方法來在使用對象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

回答

60

擴大對我的評論,發現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

11

可以動態彈出多個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) 
          } 
         } 
9

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

我寫了一個擴展的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) 
相關問題