Usar el guión gráfico es muy fácil. Simplemente arrastre la acción a "Salir". Pero, ¿cómo debo llamarlo desde mi código?
Usar el guión gráfico es muy fácil. Simplemente arrastre la acción a "Salir". Pero, ¿cómo debo llamarlo desde mi código?
Respuestas:
Inserte el nombre de Segue para relajarse.
Luego, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
con su segue identificarse.
Aquí hay una respuesta completa con el objetivo C y Swift:
1) Cree un IBAction
segmento de desconexión en su controlador de vista de destino (donde desea realizar el seguimiento). 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 está segue), ⌃ + arrastre desde "Nombre de la actividad" para salir. Debería ver la secuencia de desenrollado creada en el paso 1 en la ventana emergente. (Si no lo ve, revise el primer paso). Elija unwindToContainerVC: de la ventana emergente, o lo que sea que haya denominado su método para conectar su controlador de origen a la función IBAction de desenrollar.
3) Seleccione el segue en el esquema del documento del controlador de vista de origen del guión gráfico (aparecerá en la lista al final) y dele un identificador .
4) Llame al desenrollar segue usando este método desde el controlador de vista de origen , sustituyendo su nombre de desenrollar segue.
// 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, es posible que tenga un ciclo de retención.
(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
ctrl+drag
desde ViewController
hasta Exit
fue increíblemente útil. ¡Gracias!
bradleygriffith
La respuesta fue genial. Tomé el paso 10 e hice una captura de pantalla para simplificar. Esta es una captura de pantalla en Xcode 6.
unwind segue
en la barra lateral:[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
UIViewController
. Entonces su solución funcionará
Utilicé lo [self dismissViewControllerAnimated: YES completion: nil];
que te devolverá a la llamada ViewController
.
Citando texto de la Nota técnica de Apple sobre Unwind Segue: para agregar un desenlace de desenrollado que solo se activará mediante programación, controle + arrastre desde el ícono del controlador de vista de la escena hasta su ícono de salida, luego seleccione una acción de desenrollar para el nuevo segue del menú emergente.
La respuesta de Vishal Chaudhry anterior funcionó para mí. También agregaría eso para activar manualmente la secuencia usando:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
desde ViewController también debe seleccionar el desenrollar segue en la escena de ViewController en el guión gráfico y en la vista de propiedades en el RHS asegúrese de que el campo Identificador contenga el nombre al que se refiere en el código ("mySegueName" en el ejemplo anterior )
Si omite este paso, la línea anterior arrojará una excepción de que no se conoce el nombre de la secuencia.
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;
}
}
}
SWIFT 4 :
1. Cree una @IBAction con segue dentro del controlador que desea desenrollar:
@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}
2. En el guión gráfico, desde el controlador que desea segue (desenrollar) de 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 esquema 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 has terminado! Ahora debe abrir el controlador de vista del que desea desconectarse 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 este IBAction, agregue el método perfromSegue (withIdentifier: sender :) :
@IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
}
¡Entonces eso es todo lo que tienes que hacer!
Para aquellos que se preguntan cómo hacer esto con VC no configurados a través del guión gráfico (aquellos que vienen a esta pregunta buscando "programáticamente" + "desenrollar segue").
Dado que no puede configurar una desconexión segmentada programáticamente, la solución programática más simple es llamar a:
navigationController?.popToRootViewController(animated: true)
que mostrará todos los controladores de vista en la pila de nuevo a su controlador de vista raíz.
Para mostrar solo el controlador de vista superior de la pila de navegación, use:
navigationController?.popViewController(animated: true)
FYI: 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 clase anulada viewDidAppear así:
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear: animated];
[self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}
Si lo coloca en otros métodos ViewController como viewDidLoad o viewWillAppear , se ignorará.
performSegueWithIdentfier
hace exactamente eso: realizar la transición de un ViewController a otro