¿Para qué sirven los segmentados y cómo los usa?

iOS 6 y Xcode 4.5 tienen una nueva característica denominada “Unguender Segue”:

Los segmentos de desenrollo pueden permitir la transición a instancias existentes de escenas en un guión gráfico

Además de esta breve entrada en las notas de la versión de Xcode 4.5, ahora parece que UIViewController tiene un par de métodos nuevos:

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender - (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender - (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier 

¿Cómo funcionan los trabajos de desenrollado y para qué se pueden usar?

En una palabra

Un segue de desenrollado (a veces llamado exit segue ) se puede usar para navegar atrás a través de los segmentos push, modal o popover (como si sacara el elemento de navegación de la barra de navegación, cerró el popover o eliminó el controlador de vista presentado de forma modal). Además de eso, puedes relajarte no solo a través de una, sino de una serie de segmentaciones push / modal / popover, por ejemplo, “retroceder” varios pasos en tu jerarquía de navegación con una sola acción de desenrollar.

Cuando realiza un segue de desenrollado, necesita especificar una acción, que es un método de acción del controlador de vista que desea desenrollar.

C objective:

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

Rápido:

 @IBAction func unwindToThisViewController(segue: UIStoryboardSegue) { } 

El nombre de este método de acción se usa cuando crea el segue de desenrollamiento en el guión gráfico. Además, este método se llama justo antes de que se realice la transición de desenrollado. Puede obtener el controlador de vista de UIStoryboardSegue parámetro UIStoryboardSegue pasado para interactuar con el controlador de vista que inició el cambio (por ejemplo, para obtener los valores de propiedad de un controlador de vista modal). A este respecto, el método tiene una función similar a la del método prepareForSegue: UIViewController .

Actualización de iOS 8: los segmentos de desenrollo también funcionan con los segmentos adaptativos de iOS 8, como Mostrar y mostrar detalles .

Un ejemplo

Tengamos un guión gráfico con un controlador de navegación y tres controles de vista infantil:

enter image description here

Desde el Controlador de Vista Verde, puede desenrollar (navegar hacia atrás) hasta el Controlador de Vista Roja. Desde Azul puede relajarse en Verde o en Rojo a través de Verde. Para habilitar el desenrollado, debe agregar los métodos de acción especiales a Rojo y Verde, por ejemplo, aquí está el método de acción en rojo:

C objective:

 @implementation RedViewController - (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue { } @end 

Rápido:

 @IBAction func unwindToRed(segue: UIStoryboardSegue) { } 

Una vez que se haya agregado el método de acción, puede definir la transición de desenrollado en el guión gráfico arrastrando el dedo hasta el ícono de Salir. Aquí queremos relajarnos a Rojo desde Verde cuando se presiona el botón:

enter image description here

Debe seleccionar la acción que se define en el controlador de vista que desea desenrollar:

enter image description here

También puede relajarse en Rojo de azul (que está “a dos pasos de distancia” en la stack de navegación). La clave es seleccionar la acción de desenrollado correcta.

Antes de realizar la transición de desenrollado, se llama al método de acción. En el ejemplo, definí un segue de desenrollado en rojo tanto en verde como en azul. Podemos acceder al origen del desenrollado en el método de acción a través del parámetro UIStoryboardSegue:

C objective:

 - (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue { UIViewController* sourceViewController = unwindSegue.sourceViewController; if ([sourceViewController isKindOfClass:[BlueViewController class]]) { NSLog(@"Coming from BLUE!"); } else if ([sourceViewController isKindOfClass:[GreenViewController class]]) { NSLog(@"Coming from GREEN!"); } } 

Rápido:

 @IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) { if let blueViewController = unwindSegue.sourceViewController as? BlueViewController { println("Coming from BLUE") } else if let redViewController = unwindSegue.sourceViewController as? RedViewController { println("Coming from RED") } } 

El desenrollado también funciona a través de una combinación de segmentaciones push / modal. Por ejemplo, si agregué otro controlador de vista amarillo con una transición modal, podríamos relajar desde Amarillo hasta volver al rojo en un solo paso:

enter image description here

Desvinculación del código

Cuando define un segue de desenrollado arrastrando y arrastrando algo al símbolo Salir de un controlador de vista, aparece un nuevo segue en el contorno del documento:

enter image description here

Al seleccionar la transición y dirigirse al Inspector de atributos, se muestra la propiedad “Identificador”. Use esto para dar un identificador único a su segue:

enter image description here

Después de esto, la transición de desenrollado se puede realizar desde el código al igual que cualquier otra transición:

C objective:

 [self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self]; 

Rápido:

 performSegueWithIdentifier("UnwindToRedSegueID", sender: self) 

En cuanto a cómo usar desenrollar los segues en StoryBoard …

Paso 1)

Vaya al código del controlador de vista en el que desea relajarse y añádalo:

C objective

 - (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue { //nothing goes here } 

Asegúrese de declarar también este método en su archivo .h en Obj-C

Rápido

 @IBAction func unwindToViewControllerNameHere(segue: UIStoryboardSegue) { //nothing goes here } 

Paso 2)

En el guión gráfico, ve a la vista de la que deseas relajarte y simplemente arrastra una transición de tu botón o lo que sea hasta el pequeño icono naranja “EXIT” en la parte superior derecha de tu vista fuente.

enter image description here

Ahora debería haber una opción para conectarse a “- unwindToViewControllerNameHere”

Eso es todo, tu transición se relajará cuando se toque el botón.

Los segmentos de desenrollado se usan para “retroceder” a algún controlador de vista desde el cual, a través de una serie de pasos, se llega al controlador de vista “actual”.

Imagine que tiene algo como MyNavController con A como su controlador de vista raíz. Ahora usa una transición de inserción a B Ahora el controlador de navegación tiene A y B en su matriz viewControllers , y B es visible. Ahora presenta C modal.

Con los segues de desenrollar, ahora puede desenrollar “volver” de C a B (es decir, descartar el controlador de vista presentado de forma modal), básicamente, “deshacer” la transición modal. Incluso podría relajar todo el camino de regreso al controlador de vista raíz A , deshaciendo tanto la transición modal como la transición de inserción.

Los segmentos de desenrollo facilitan el retroceso. Por ejemplo, antes de iOS 6, la mejor práctica para descartar los controladores de vista presentados era establecer el controlador de vista de presentación como el delegado del controlador de vista presentado, luego llamar a su método de delegado personalizado, que luego descarta el ViewViewController presentado . ¿Suena engorroso y complicado? Era. Es por eso que los desenrollamientos son agradables.

Algo que no vi mencionar en las otras respuestas aquí es cómo lidias con el desenrollamiento cuando no sabes dónde se originó la segue inicial, que para mí es un caso de uso aún más importante. Por ejemplo, supongamos que tiene un controlador de vista de ayuda ( H ) que muestra modalmente desde dos controladores de vista diferentes ( A y B ):

AH
BH

¿Cómo configura la transición de desenrollado para que regrese al controlador de vista correcto? La respuesta es que declaras una acción de desenrollamiento en A y B con el mismo nombre , por ejemplo:

 // put in AViewController.swift and BViewController.swift @IBAction func unwindFromHelp(sender: UIStoryboardSegue) { // empty } 

De esta forma, el desenrollado encontrará el controlador de vista ( A o B ) que haya iniciado el cambio y regrese a él.

En otras palabras, piense en la acción de desenrollar como describiendo de dónde viene la segue, en lugar de hacia dónde va.

Swift iOS:

Paso 1: defina este método en su vista de controlador MASTER. en el que quieres volver:

 //pragma mark - Unwind Seques @IBAction func goToSideMenu(segue: UIStoryboardSegue) { println("Called goToSideMenu: unwind action") } 

Paso 2: (StoryBoard) Haga clic con el botón derecho en su botón ESCLAVO / SALIR DEL NIÑO y seleccione “goToSideMenu” Como acción para Conectar su Botón en el que hará clic para regresar a su vista del controlador MASTER:

enter image description here paso 3: comstackr y ejecutar …

Por ejemplo, si navega de viewControllerB a viewControllerA, en su viewControllerA a continuación, el delegado llamará y los datos se compartirán.

 @IBAction func unWindSeague (_ sender : UIStoryboardSegue) {        if sender.source is ViewControllerB  {            if let _ = sender.source as? ViewControllerB {                self.textLabel.text = "Came from B = B->A , B exited"            }                   } } 
  • Relájese Seague Source View Controller (Necesita conectar el botón Exit al ícono de salida de VC y conéctelo a unwindseague:

enter image description here

  • Relájese Seague Completed -> TextLabel of viewControllerA se ha modificado.

enter image description here