¿Cómo descartar todos los controladores de vista menos uno y abrir el controlador de vista especificado en Swift?

CorePress2024-01-25  12

Tengo un montón de vistas y luego un botón de cierre de sesión, que cierra la sesión del usuario y lo lleva al primer controlador de vista (una pantalla de inicio de sesión/registro). Intenté hacer esto con una presentación modal, pero destruye mi navegación y no puedo usar un pop para el controlador de vista raíz porque no es el controlador de vista raíz; tengo al menos 2 controladores de navegación de profundidad. ¿Cómo haría para mostrar de alguna manera solo el primero? Básicamente necesito que actúe como si la aplicación acabara de reiniciarse. ¿Ayudaría de alguna manera relajarse las transiciones? Gracias, esto es lo que quiero decir con estropear la navegación. Ahora aparecen los siguientes controladores de vista, en lugar de cómo debería verse (la siguiente imagen es de la primera vez que se inicia la aplicación)



------------------------------------

Suponiendo que utiliza un UINavigationController, puede utilizar el método UINavigationController.setViewControllers(_:animated:) en combinación con UINavigationController.viewControllers. Este último le proporciona una serie de controladores de vista en el orden exacto en que los apila el controlador de navegación, mientras que el primero se puede utilizar para alterar la pila de navegación. Por ejemplo, si desea conservar solo los primeros 3 controladores de vista en la pila de navegación:

guard let navigationController = self.navigationController else { return }
let viewControllersToKeep = navigationController.viewControllers.prefix(3)
navigationController.setViewControllers(viewControllersToKeep, animated: true)

Nota: La animación realizada por el controlador de navegación en este caso suele ser (creo que siempre, pero no estoy 100% seguro) una animación push en lugar de pop, que podría no ser la deseada.

Así que siSi desea que el controlador de navegación realice una animación pop, entonces debe llamar a pop hasta llegar al controlador de vista deseado, pero la clave es animar un solo pop. Para el mismo ejemplo anterior:

guard let navigationController = self.navigationController else { return }
let numberOfPops = navigationController.viewControllers.count - 3
for i in 0..<numberOfPops {
    let animated = i == 0
    navigationController.popViewController(animated: animated)
}

Espero que esto responda la pregunta sobre cómo acceder al controlador de vista deseado (puede detectar su controlador de vista por su tipo, luego puede encontrar su índice y usar la lógica anterior).

Si desea descartar el primer controlador de vista de presentación, debe llamar a UIViewController.dismiss(animated:completion:) en el primer controlador de vista de presentación. El método de descarte se comportará así:

Si el controlador de vista presenta un controlador de vista, descartará el controlador de vista presentado; Si el controlador de vista no presenta ninguna vista continuaroller, pero lo presenta otro controlador de vista (es decir, tiene un controlador de vista principal), luego le pedirá al controlador de vista principal que lo descarte; Si no hay ninguna de las anteriores, no hará nada.

En pocas palabras, debes llamar a descartar en el controlador de vista que deseas que permanezca en la pantalla.



------------------------------------

Básicamente necesito que actúe como si la aplicación acabara de reiniciarse.

En este caso, asignar el controlador de pantalla de inicio de sesión/registro a UIWindow.rootViewController parece ser la opción correcta. Este tema ya se ha tratado aquí: Swift ios establece un nuevo control de vista raízes

1

Esto funciona, pero aún complica la navegación. Agregué capturas de pantalla a la publicación que explican lo que quiero decir.

Matej Hantabal

28/03/2021 a las 17:37

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare