Eliminando viewcontrollers de la stack de navegación

Tengo una stack de navegación, con decir 5 UIViewControllers. Quiero eliminar los controladores de vista 3 y 4 en la stack con el clic de un botón en el 5to controlador de vista. ¿Es posible hacer esto? ¿Si es así, cómo?

Usa este código y disfruta:

NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers]; // [navigationArray removeAllObjects]; // This is just for remove all view controller from navigation stack. [navigationArray removeObjectAtIndex: 2]; // You can pass your index here self.navigationController.viewControllers = navigationArray; [navigationArray release]; 

Espero que esto te ayudará.

Primero puede obtener todos los controladores de visualización en el conjunto y luego, después de consultar con la clase de controlador de vista correspondiente, puede eliminar el que desee.

Aquí hay un pequeño fragmento de código:

 NSArray* tempVCA = [self.navigationController viewControllers]; for(UIViewController *tempVC in tempVCA) { if([tempVC isKindOfClass:[urViewControllerClass class]]) { [tempVC removeFromParentViewController]; } } 

Creo que esto hará que tu trabajo sea más fácil.

Swift 3 y 4

self.navigationController!.viewControllers.removeAll()

self.navigationController?.viewControllers.remove(at: "insert here a number")

Swift 2.1

eliminar todo:

self.navigationController!.viewControllers.removeAll()

eliminar en el índice

self.navigationController?.viewControllers.removeAtIndex("insert here a number")

Hay un montón de más acciones posibles como removeFirst, rango, etc.

Swift 2.0:

  var navArray:Array = (self.navigationController?.viewControllers)! navArray.removeAtIndex(navArray.count-2) self.navigationController?.viewControllers = navArray 

Si está tratando de pasar al controlador de 2da vista desde el controlador de 5ta vista (omitiendo el 3er y el 4to), le gustaría usar [self.navigationController popToviewController:secondViewController] .

Puede obtener el secondViewController desde la stack del controlador de navegación.

 secondViewController = [self.navigationController.viewControllers objectAtIndex:yourViewControllerIndex]; 

Utilizar esta

 if let navVCsCount = navigationController?.viewControllers.count { navigationController?.viewControllers.removeSubrange(Range(2.. 

Se ocupará de ViewControllers de navigationController. viewControllers y también un navigationItems astackdos en navigationBar.

Nota: asegúrese de llamarlo al menos después de viewDidAppear

El uso de la función setViewControllers desde UINavigationController es la mejor manera. También hay un parámetro animated para habilitar la animación.

 func setViewControllers(_ viewControllers: [UIViewController], animated: Bool) 

Ejemplo en rápido para la pregunta

 func goToFifthVC() { var currentVCStack = self.navigationController?.viewControllers currentVCStack?.removeSubrange(2...3) let fifthVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "fifthVC") currentVCStack?.append(fifthVC) self.navigationController?.setViewControllers(currentVCStack!, animated: true) } 

Intenté otras maneras como [tempVC removeFromParentViewController]; . Tiene un comportamiento extraño, se borró la navegación de ViewController que aún se muestra cuando aparece el pop back reportado por @ robin-ellerkmann

Esta solución funcionó para mí en swift 4:

 let VCCount = self.navigationController!.viewControllers.count self.navigationController?.viewControllers.removeSubrange(Range(VCCount-3.. 

su índice de controlador de vista actual en la stack es:

 self.navigationController!.viewControllers.count - 1