ios - for - show segue
Personalizado UIStoryboardSegue usando segueWithIdentifier: source: destination: performHandler: (1)
El punto de segueWithIdentifier:source:destination:performHandler:
- Proporcione una alternativa a
UIViewController performSegueWithIdentifier:sender
en los casos en los que también desee crear una transición personalizada, sin crear una subclase de segue. - Venda un segmento que se puede usar como el retorno para
segueForUnwindingToViewController:fromViewController:identifier
Como se mencionó anteriormente, este enfoque solo es viable para los segmentos a los que llamaría de manera manual, es decir, no para los segmentos que de otra manera serían activados a través de los activadores de IB.
Por ejemplo, si tiene un segmento que debe activarse después de un cierto período de tiempo de espera (como una pantalla de bloqueo personalizada), puede usar segueWithIdentifier:source:destination:performHandler:
para manejar la transición personalizada.
-(void)appTimeoutLockScreen
{
UIStoryboardSegue *segue =
[UIStoryboardSegue segueWithIdentifier:@"LockScreenSegue"
source:sourceVC
destination:destinationVC
performHandler:^{
// transition code that would
// normally go in the perform method
}];
// Dev is responsible for calling prepareForSegue and perform.
// Note, the order of calls for an IB triggered segue as well as
// a performSegueWithIdentifier segue is perform first, then
// prepareForSegue:sender. Manual segues need to inverse the call
// in order to ensure VC setup is finished before transition.
[self prepareForSegue:segue sender:self];
[segue perform];
}
Otro uso práctico del método es desenrollar segues. Usando un escenario similar al del ejemplo anterior, podríamos usarlo para devolver un segmento a la transición de una pantalla de bloqueo al controlador de visualización anterior:
-(UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController*)toVC
fromViewController:(UIViewController *)fmVC
identifier:(NSString *)identifier
{
UIStoryboardSegue *segue =
[UIStoryboardSegue segueWithIdentifier:@"FromLockScreenSegue"
source:fmVC
destination:toVC
performHandler:^{
// transition code
}];
return segue;
}
Estoy tratando de usar un UIStoryboardSegue
personalizado para implementar una transición entre dos controladores de vista. Puedo hacer esto subclasificando UIStoryboardSegue
y luego configurando esta clase en IB. Sin embargo, estaba mirando los documentos que dicen:
Si su segmento no necesita almacenar información adicional o proporcionar algo que no sea un método de ejecución, considere usar el método segueWithIdentifier: source: destination: performHandler: en su lugar.
Lo que implica que no es necesario crear la subclase personalizada, solo use el PerformHandler personalizado.
Estoy confundido en cuanto a dónde debería ir este código y cómo lo uso. ¿Debo crear el segmento como es normal en IB y luego anularlo antes de que se active (quizás en shouldPerformSegue: o similar)? En otra parte de la documentación de Apple dice:
Tu aplicación nunca crea objetos de forma directa; iOS siempre los crea en su nombre cuando se activa un segue
Así que no entiendo muy bien por qué dicen eso para crear una instancia de un segmento usando un método de creación de clases.