Tengo una pila de navegación, con 5 UIViewControllers. Quiero eliminar los controladores de vista tercero y cuarto de la pila con solo hacer clic en un botón en el controlador de vista quinto. ¿Es posible hacer esto? ¿Si es así, cómo?
iphone
ios
uiviewcontroller
uinavigationcontroller
Jean Paul Scott
fuente
fuente
Primero puede obtener todos los controladores de vista en la matriz y luego, después de verificar con la clase de controlador de vista correspondiente, puede eliminar el que desee.
Aquí hay un pequeño fragmento de código:
Creo que esto facilitará tu trabajo.
fuente
Swift 3 y 4/5
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 acciones posibles como removeFirst, range, etc.
fuente
Rápido 5:
fuente
return !vc.isKind(of: MyViewController.self) && !vc.isKind(of: MyViewController2.self)
haría el trabajo en una línea :-)Usar la
setViewControllers
función deUINavigationController
es la mejor manera. También hay unanimated
parámetro para habilitar la animación.Ejemplo en rápido para pregunta
Intenté otras formas como
[tempVC removeFromParentViewController];
. Tiene un comportamiento extraño, eliminó la navegación de ViewController que aún se muestra cuando aparece como lo informó @ robin-ellerkmannfuente
setViewControllers(_:animated:)
técnica de ambas maneras: para hacer estallar múltiples controladores y presionar múltiples controladores.Swift 2.0:
fuente
if var navArray = ... { ... }
Swift 5, Xcode 11.3
Encontré este enfoque simple al especificar qué controlador (es) de vista desea eliminar de la pila de navegación.
Ejemplo de uso:
fuente
Si está intentando pasar al controlador de la segunda vista desde el controlador de la quinta vista (omitiendo la tercera y la cuarta), le gustaría usar
[self.navigationController popToviewController:secondViewController]
.Puede obtener el
secondViewController
de la pila del controlador de navegación.fuente
Utilizar este
Se encargará de ViewControllers de navigationController. viewControllers y también un navigationItems apilado en navigationBar.
Nota: asegúrese de llamarlo al menos después de viewDidAppear
fuente
Esta solución funcionó para mí en swift 4:
su índice actual del controlador de vista en la pila es:
fuente
Swift 5.1, Xcode 11
Asegúrese de llamar a esta función de utilidad después de viewDidDisappear () del controlador anterior o viewDidAppear () del nuevo controlador
fuente
Detalles
Solución
Uso
Muestra completa
Resultado
fuente
Escribí una extensión con un método que elimina todos los controladores entre la raíz y la parte superior, a menos que se especifique lo contrario.
}
Si desea usar el rango (por ejemplo: 2 a 5), puede usar
Probado en iOS 12.2, Swift 5
fuente
// eliminando los controladores de vista por nombres de clase de la pila y luego descartando la vista actual.
fuente