Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=44a216e2-0217-41ea-abf3-fbaa21ee8b91

Programación iOS: Cómo volver correctamente a una vista anterior (Segues Unwind)

segues-unwindEn una aplicación móvil lo normal es que dispongamos de diversas vistas en la interfaz de usuario que se van abriendo unas a otras en una determinada secuencia de navegación. Por regla general los usuarios vuelven hacia atrás con el botón correspondiente y la secuencia de "navegación" por las vistas es lineal:

Segue-Vistas-p

En la figura anterior el usuario se movería a la primera vista, luego a la segunda, y así sucesivamente, pudiendo volver hacia atrás en cualquier momento usando la interfaz de usuario.

Sin embargo una situación muy común también es que, desde cualquiera de las vistas deseemos que el usuario "salte" directamente a la primera, deshaciendo el camino pero de golpe. Por ejemplo, en la secuencia anterior podríamos desear que desde la vista #3 se pudiese volver directamente a la primera vista además de continuar a la #4. Y desde esta última poder volver también directamente a la primera, sin tener que pasar por las intermedias:

Segue-Unwind-p

La primera cosa que se le puede ocurrir a cualquiera es crear un segue que vaya directamente desde la vista actual en la que estamos trabajando a la vista en la que queremos terminar. Es decir, en el ejemplo crearíamos dos segues desde las vistas #3 y #4 que apuntarían a la vista #1.

Si lo probamos veremos que aparentemente funciona, pero en realidad no nos estamos dando cuenta de que estamos creando un problema de rendimiento, además de utilizando mal un concepto importante dentro de la programación de interfaces de usuario móviles.

Una posible solución que se ha empleado tradicionalmente es la de proceder según el siguiente flujo:

  1. Crear un delegado en el View Controller de destino
  2. Implementar ese delegado en el View Controles de origen (es decir, desde donde partimos)
  3. En el método prepareForSegue ajustar el delegado de destino para que apunte al de origen.
  4. Al regresar empezar a lanzar métodos recursivamente en toda la pila de delegados hasta que llegues a donde necesitas llegar.

Un proceso largo, tedioso y propenso a errores.

Para solucionar este problema de una forma elegante y directa iOS nos ofrece el concepto de segues unwind, es decir, segues que están diseñados precisamente para hacer lo que necesitamos de manera automática. Estos segues conseguirán que volvamos a la vista que queramos deshaciendo la pila de vistas de manera correcta y sin causar problemas de rendimiento.

Estos segues tienen varias particularidades y cosas que pueden sorprender la primera vez que los usas, como por ejemplo:

  • Normalmente cuando creas un outlet de acción para un botón XCode crea el código inicial por ti. En este tipo de segues es justo al revés: debes tener el código ya hecho y asignarlo al botón. Algo que choca bastante la primera vez.
  • Otra cosa rara es que, por regla general, el código asociado a un elemento de la interfaz de usuario suele estar ubicado dentro de la misma clase que éste. Sin embargo en este tipo de acciones el código está en la clase relacionada con la vista de destino. Poco intuitivo.

El patrón de este tipo de métodos de acción es el siguiente en Swift:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

y en Objective-C:

(IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}

En el siguiente vídeo práctico  explico los problemas que puede acarrear hacerlo de manera incorrecta, y luego muestro cómo crear segues de tipo unwind para hacer el regreso entre vistas de la manera apropiada:

Para saber más: Apple Developer - Technical Note TN2298 - Using Unwind Segues

Fecha de publicación:
Eduard Tomás Eduard es ingeniero informático y atesora muchos años de experiencia como desarrollador. Está especializado en el desarrollo de aplicaciones web y móviles. Mantiene un conocido blog sobre desarrollo en .NET en general y ASP.NET MVC en particular. Colabora con la comunidad impartiendo charlas en formato webcast y en eventos de distintos grupos de usuarios. Puedes seguirlo en Twitter en @eiximenis. Ver todos los posts de Eduard Tomás
Archivado en: Desarrollo móvil

¿Te ha gustado este post?
Pues espera a ver nuestro boletín mensual...

Suscríbete a la newsletter

La mejor formación online para desarrolladores como tú

Comentarios (2) -

Adrian Rodriguez Diaz
Bolivarian Republic of Venezuela Adrian Rodriguez Diaz

hola que tal? estoy aprendiendo a programar en iOS, y vi tu tutorial, lo estoy haciendo en Objective-C y cuando coloco el segmento de código:

(IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}

tal y como lo indicas en el video, claro tu usas swift, me sale 2 errores en vez del puntico redondo.
el primer error es Expected ')' y el segundo error el Expected identifier or '(' el puntero de ambos error esta por debajo de la I de (IBAction)

Responder

Eduard Tomàs
Spain Eduard Tomàs

Buenas!
Te falta el - al principio, indicando que este método es un método de instancia:

- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}

Saludos!



Responder

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.