2014-10-01 3 views
12

Ho trovato molti modi per far tornare indietro i controller di vista in un controller di navigazione utilizzando l'oggetto C, tuttavia quando provo a passare a quello rapido non sembra funzionare.Pop 2 view controller in Nav Controller in Swift

Quale sarebbe l'approccio migliore per tornare alla visualizzazione dei controller? Qualsiasi orientamento sarebbe apprezzato Grazie

+0

Molto lo stesso come in objC: copiare il '' matrice viewControllers' di UINavigationController', eliminarne le ultime due elementi di questo array e impostare 'viewControllers' alla matrice modificata. C'è anche un 'setViewControllers (_: animated:)' per includere l'animazione pop. – fluidsonic

+3

In alternativa è possibile trovare il penultimo controller della vista nell'array 'viewControllers' e quindi usare' popToViewController' per evitare di sovrascrivere l'intero stack del controller di visualizzazione. –

+0

È possibile accedere a un controller dalla sua classe http://stackoverflow.com/questions/30003814/how-can-i-pop-specific-view-controller-in-swift/40314079#40314079 – PabloR

risposta

60

Ampliando il mio commento, trovare il penultimo View Controller nella matrice viewControllers e quindi utilizzare popToViewController per evitare di sovrascrivere l'intero stack View Controller.

Esempio (presuppone che il controller di navigazione ha più di 1 View Controller):

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

questo ha funzionato meravigliosamente grazie! Domanda successiva: quando si apre il controller di visualizzazione corretto, per prima cosa trasforma la vista orizzontale in verticale, quindi viene visualizzata. C'è un modo per non farlo ruotare la vista orizzontale prima di scoppiare? – candidaMan

+5

wow grazie Aaron, questo ha funzionato perfettamente! abbastanza stranamente, ho dovuto mettere a 'viewControllers.count - 3' per tornare indietro di due passi, ma ora funziona meravigliosamente! –

11

È possibile pop dinamicamente più viewcontrollers a (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 risposta nella 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

Ho scritto un'estensione UIViewController (Swift 3+ pronti)

si potrebbe usare in questo modo:

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

Usage:

self.popBack(3) 

Bonus respingere a uno specifico 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 
      } 
     } 
    } 
} 

Usage:

self.popBack(toControllerType: MyViewController.self)