perform for objective-c ios storyboard segue

objective-c - for - segue swift 4



¿Cómo volver a un UIViewController que ya está cargado? (4)

Tengo una vista en un guión gráfico que tiene un botón para realizar una determinada acción. Sin embargo, para realizar esta acción, el usuario debe haber iniciado sesión. El manejador de botones prueba si el usuario está conectado y realiza una transición si es SÍ y otra si NO. El NO segues empuja a un controlador de vista de inicio de sesión. Hay otra transición que se conecta de nuevo al controlador de la primera vista, por lo que si el inicio de sesión es exitoso, el usuario puede continuar desde donde lo dejó. Los controladores de vista están integrados en un controlador de navegación.

El problema es que la secuencia de ''retorno'' carga una instancia completamente nueva del controlador de vista y no hace referencia a la instancia original, por lo que termino con elementos de interfaz vacíos y 2 copias de ese controlador de vista en la memoria.

¿Cómo puedo volver a la instancia original del controlador de vista?


En lugar de usar un segue para volver al controlador anterior, debe usar el evento asociado con el segue al volver a descartar el controlador de vista actual (si el cambio fue modal) o extraerlo del controlador de navegación (si el cambio fue presionar) y el controlador anterior se mostrará automáticamente.

Por ejemplo, si la transición modal que se realizaba atrás se realizaba al presionar un botón en su pantalla de inicio de sesión, elimina la transición del guión gráfico y en el evento de retoque dentro del botón que vincula con su acción que, al iniciar sesión correctamente llamará:

[self dismissViewControllerAnimated:YES completion:nil];

En el guión gráfico, haga clic derecho en el botón y arrastre el toque dentro del evento enviado al primer respondedor de la escena del controlador de vista. Esto ejecutará la transición inversa que se ejecutó cuando realizó la transición de segue. Puede usar una transición modal para eso, sin necesidad de usar un controlador de navegación.

Si presionó la vista de inicio de sesión en el controlador de navegación, debe sacarlo de la pila (si vuelve a la vista anterior). Usa uno de estos:

[[self navigationController] popViewControllerAnimated:YES]; // goes back to previous view [[self navigationController] popToViewController: myViewControllerAfterLogin animated:YES]; // goes back to specific view on stack. [[self navigationController] popToRootViewControllerAnimated:YES]; // goes back to first view on the stack

La transición animada debe invertir el tipo de transición utilizada en el segue, por lo que el curl up se reducirá cuando descarte la vista.



malhal tiene razón, vale la pena hacer clic en su enlace.

Parece que el código se movió un poco del ejemplo de Apple y es aún más flexible. Tengo tres escenas pero solo un archivo ViewController .m personalizado. No quería una pila de navegación. El acceso a las escenas subsiguientes se realiza mediante segues de botones. Agregué esta línea en el archivo .m del controlador de vista base:

- (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC{}

Luego, en la tercera escena, controlé-arrastré desde un botón hasta el icono de salida y seleccioné la acción de desenrollar. Ahora regresa de la escena 3 de vuelta a la escena 2 sin necesidad de llamar a un método de descartar ViewController.


Suponiendo que utilizas " push " significa que estás usando un UINavigationController , entonces puedes usar lo siguiente para regresar a la parte superior de la pila.

[self.navigationController popToRootViewControllerAnimated:YES];

o

UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>]; [self.navigationController popToViewController:prevVC animated:YES];

para llegar a un nivel específico donde <n> es el nivel.

o

[self.navigationController popViewControllerAnimated:YES];

Si solo quieres abrir un nivel, haz una copia de seguridad de la pila de navegación.