En una palabra
Se puede usar un segue de desenrollado (a veces llamado segue de salida ) para navegar hacia atrás a través de segues push, modal o popover (como si sacara el elemento de navegación de la barra de navegación, cerró el popover o descartó el controlador de vista presentado modalmente). Además de eso, puede desenvolverse no solo a través de una serie de segmentos push / modal / popover, por ejemplo, "retroceder" múltiples pasos en su jerarquía de navegación con una sola acción de desenrollado.
Cuando realiza una secuencia de desenrollado, debe especificar una acción, que es un método de acción del controlador de vista al que desea desenrollarse.
C objetivo:
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}
Rápido:
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}
El nombre de este método de acción se usa cuando crea la secuencia de desenrollado en el guión gráfico. Además, este método se llama justo antes de que se realice la secuencia de desenrollado. Puede obtener el controlador de vista de origen del UIStoryboardSegue
parámetro pasado para interactuar con el controlador de vista que inició la segue (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 al prepareForSegue:
método de UIViewController
.
Actualización de iOS 8: Unwind segues también funciona con los segmentos adaptativos de iOS 8, como Show y Show Detail .
Un ejemplo
Tengamos un guión gráfico con un controlador de navegación y tres controladores de vista secundarios:
Desde Green View Controller puede relajarse (navegar hacia atrás) a Red View Controller. 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 objetivo:
@implementation RedViewController
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}
@end
Rápido:
@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}
Una vez que se ha agregado el método de acción, puede definir la secuencia de desenrollado en el guión gráfico al arrastrar el control al icono Salir. Aquí queremos desconectarnos de Rojo a Verde cuando se presiona el botón:
Debe seleccionar la acción que se define en el controlador de vista que desea desenrollar:
También puede relajarse en Rojo desde Azul (que está "a dos pasos" en la pila de navegación). La clave es seleccionar la acción de desenrollado correcta.
Antes de que se realice la secuencia de desenrollado, se llama al método de acción. En el ejemplo, definí un desenrollar segue a Rojo desde Verde y Azul. Podemos acceder a la fuente del desenrollado en el método de acción a través del parámetro UIStoryboardSegue:
C objetivo:
- (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")
}
}
Desenrollar también funciona a través de una combinación de segues push / modal. Por ejemplo, si agregué otro controlador de vista Amarillo con una secuencia modal, podríamos desconectarnos de Amarillo hasta el Rojo en un solo paso:
Desenrollar del código
Cuando define un segue de desenrollado arrastrando algo con control al símbolo Exit de un controlador de vista, aparece un nuevo segue en el Esquema del documento:
Al seleccionar el segmento e ir al Inspector de atributos, se revela la propiedad "Identificador". Use esto para dar un identificador único a su segue:
Después de esto, el desenrollado puede realizarse desde el código como cualquier otro segue:
C objetivo:
[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];
Rápido:
performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
dismissViewControllerAnimated:completion:
opopViewControllerAnimated:
lograr lo mismo?