ios - ¿Cómo realizar Unwind segue programáticamente?
ios6 (9)
Usando el guión gráfico esto es muy fácil. Simplemente arrastra la acción a "Salir". ¿Pero cómo debería llamarlo desde mi código?
- Cree un segue manual ( ctrl -drag desde el propietario del archivo para salir),
- Elíjalo en el menú del controlador izquierdo debajo del botón EXIT verde.
Inserte el nombre de Segue para desenrollar.
Luego, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
con su segue identifique.
Aquí hay una respuesta completa con Objective C y Swift:
1) Cree un IBAction
desenvolvimiento de IBAction
en su controlador de vista de destino (donde desea segue). En cualquier lugar del archivo de implementación.
// Objective C
- (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {
}
// Swift
@IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {
}
2) En el controlador de vista de origen (el controlador del que se está segueing), + arrastre desde "Nombre de la actividad" para salir. Debería ver el segmento de desenrollado creado en el paso 1 en la ventana emergente. (Si no lo ves, revisa el primer paso). Elija unwindToContainerVC: desde la ventana emergente, o como se llame a su método para conectar su controlador de origen a la acción IBA desenrollada.
3) Seleccione el segmento en el esquema del documento del controlador de vista de origen del guión gráfico (se mostrará en la parte inferior) y asígnele un identificador .
4) Llame al segmento de desenrollado utilizando este método desde el controlador de vista de origen , sustituyendo su nombre de segmento de desenrollado.
// C objetivo
[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];
// Swift
self.performSegueWithIdentifier("unwindToContainerVC", sender: self)
NÓTESE BIEN. Use la propiedad sourceViewController del parámetro segue en el método de desenrollado para acceder a las propiedades expuestas en el controlador de origen. Además, observe que el marco se encarga de descartar el controlador de origen. Si desea confirmar esto, agregue un método dealloc al controlador de origen con un mensaje de registro que debería activarse una vez que se haya eliminado. Si Dealloc no dispara, puede tener un ciclo de retención.
Citar texto de la Nota técnica de Apple sobre Segue de desenrollado: Para agregar un segmento de desenrollado que solo se activará mediante programación, control + arrastre desde el ícono del controlador de vista de la escena a su icono de salida, luego seleccione una acción de desenrollar para el nuevo segmento en el menú emergente.
La respuesta anterior de Vishal Chaudhry funcionó para mí. También agregaría que para activar manualmente la secuela usando:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
desde dentro del ViewController también debe seleccionar el segmento de desenrollar debajo de la escena del ViewController en el guión gráfico y en la vista de propiedades en el RHS asegurarse de que el campo del identificador contenga el nombre al que hace referencia en el código ("mySegueName" en el ejemplo anterior) ).
Si omite este paso, la línea anterior generará una excepción que desconoce el nombre de la secuencia.
La respuesta de bradleygriffith
fue genial. Tomé el paso 10 e hice una captura de pantalla para simplificar. Esta es una captura de pantalla en Xcode 6.
Simplemente presione la tecla Control y arrastre desde el ícono naranja al ícono rojo Salir para crear un desenrollado sin ninguna acción / botón en la vista.
Luego, seleccione el unwind segue
y establezca algún identificador para acceder a él desde el código.
En codigo,
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
Para su información: Para que la respuesta de @ Vadim funcione con una acción de secuencia de desenrollado manual llamada desde un controlador de vista, debe colocar el comando:
[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
Dentro del método de la clase anulada viewDidAppear así:
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear: animated];
[self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}
Si lo pones en otros métodos ViewController como viewDidLoad o viewWillAppear , se ignorará.
Solución compatible con versiones anteriores que funcionará para versiones anteriores a ios6, para aquellos interesados:
- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {
for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
if ([vc isKindOfClass:vcClass]) {
[self.navigationController popToViewController:vc animated:animated];
return;
}
}
}
Utilicé [self dismissViewControllerAnimated: YES completion: nil];
que le devolverá al ViewController
llamante.
SWIFT 4 :
1. Cree una @IBAction con segue dentro del controlador que desea desconectar para:
@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}
2. En el guión gráfico, desde el controlador que desea segue (desenrollar) desde ctrl + arrastre desde el signo del controlador para salir del signo y elegir el método que creó anteriormente:
3. Ahora puede notar que en el resumen del documento tiene una nueva línea con el título "Desenrollar segue ....". Ahora debe hacer clic en esta línea y abrir el inspector de atributos para establecer el identificador (en mi caso, unwindSegueIdentifier ).
4. ¡Ya casi terminas! Ahora necesita abrir el controlador de vista del que desea desconectar y crear algún método que realice segue. Por ejemplo, puede agregar un botón, conectarlo con el código con @IBAction , después de eso dentro de esta IBAction agregar el método perfromSegue (withIdentifier: sender :) :
@IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
}
¡Así que eso es todo lo que tienes que hacer!