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?dismissViewControllerAnimated:completion:
opopViewControllerAnimated:
es que se llama al método que agregó al controlador de vista al que se está desenrollando y, por lo tanto, tiene una manera fácil de saber que el controlador de vista presentado está terminado sin tener que hacer que el controlador de vista actual sea un delegado del controlador de vista presentado .En cuanto a cómo usar desconectar segues en StoryBoard ...
Paso 1)
Vaya al código del controlador de vista en el que desea relajarse y agregue esto:
C objetivo
Asegúrese de declarar también este método en su archivo .h en Obj-C
Rápido
Paso 2)
En el guión gráfico, vaya a la vista desde la que desea relajarse y simplemente arrastre un segmento desde su botón o lo que sea hasta el pequeño ícono naranja "SALIR" en la esquina superior derecha de su vista de origen.
Ahora debería haber una opción para conectarse a "- unwindToViewControllerNameHere"
Eso es todo, tu segue se desenrollará cuando toques el botón.
fuente
Los valores de desconexión se utilizan para "volver" a algún controlador de vista desde el cual, a través de una serie de valores, se obtiene el controlador de vista "actual".
Imagine que tiene algo
MyNavController
conA
su controlador de vista raíz. Ahora usa un empuje segue aB
. Ahora el controlador de navegación tiene A y B en suviewControllers
matriz, y B es visible. Ahora presentasC
modalmente.Con segues de desenrollado, puede ahora relajarse "vuelta" de
C
aB
(es decir, se desestima el controlador de vista modal presenta), básicamente "deshacer" el segue modal. Incluso podría relajarse hasta el controlador de vista raízA
, deshaciendo tanto el modo modal como el segmento de inserción.Relájese segues hacen que sea fácil retroceder. 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 presentada, luego llamar a su método de delegado personalizado, que luego descarta el Controlador de vista presentada . ¿Suena engorroso y complicado? Era. Es por eso que relajarse segues son agradables.
fuente
dismissViewController:animated
desde el controlador presentado. No tienes que delegar eso. Por supuesto, si necesita devolver datos, entonces necesita delegación u otro método.dismissViewController:animated:
desde el controlador presentado, la "mejor práctica" fue llamar a un método delegado en el controlador que presenta para que lo haga por usted, como mencionó Yang.Algo que no vi mencionado en las otras respuestas aquí es cómo lidiar con el desenrollado cuando no sabe dónde se originó el segmento inicial, lo 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 ):
A → H
B → H
¿Cómo se configura la desconexión para que regrese al controlador de vista correcto? La respuesta es que declaras una acción de desconexión en A y B con el mismo nombre , por ejemplo:
De esta manera, el desenrollado encontrará el controlador de vista ( A o B ) que inició la secuencia y volverá a él.
En otras palabras, pensar en la acción de desenrollado como la descripción de donde el segue viene de , en lugar de hacia dónde se dirige a.
fuente
Swift iOS:
Paso 1: defina este método en la vista del controlador MASTER. en el que quieres volver:
Paso 2: (StoryBoard) Haz clic derecho en tu botón ESCLAVO / SALIDA INFANTIL y selecciona "goToSideMenu" como acción para conectarte Botón en el que harás clic para volver a la vista del controlador MASTER:
Paso 3: compilar y ejecutar ...
fuente
Por ejemplo, si navega desde viewControllerB hasta viewControllerA, en su viewControllerA debajo, el delegado llamará y los datos se compartirán.
fuente