Estoy intentando convertir nuestra aplicación para guiones gráficos y he golpeado lo que creo que es un error en el manejo de segues de desenrollado cuando se trata de controladores contenedor personalizado. Tenemos un controlador de vista que muestra otro y usa la API de contención del controlador de vista para hacer esto, conecto el segue en IB y luego selecciono una clase personalizada para la implementación. El método de llevar a cabo es como la siguiente:No se puede crear desenrollado da paso al utilizar vista personalizada controlador de contención
-(void) perform {
UIViewController *container = [self sourceViewController];
UIViewController *child = [self destinationViewController];
[container addChildViewController:child];
[container.view addSubview:child.view];
child.view.center = container.view.center;
[UIView transitionWithView:container.view
duration:0.35
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
child.view.alpha = 1;
} completion:^(BOOL finished) {
[child didMoveToParentViewController:container];
}];
}
que funciona perfectamente, sin embargo no puedo hacerlo funcionar al segue desenrollado de vuelta al controlador contenedor. Puedo reemplazar viewControllerForUnwindSegueAction: fromViewController: withSender: y asegurarse de que es devolver el valor correcto:
-(UIViewController *) viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender {
id default = [super viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
NSAssert1(default == self, @"Expected the default view controller to be self but was %@", default);
return default;
}
También puedo confirmar que canPerformUnwindSegueAction: fromViewController: withSender se está llamando y haciendo lo correcto, pero para asegurarse de que los datos sobrescritos para volver SÍ
-(BOOL) canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender {
return YES;
}
El siguiente paso que se puede esperar que ocurra es segueForUnwindingToViewController: fromViewController: identificador: a llamarse, sin embargo nunca lo es. En cambio, la aplicación se bloquea con una NSInternalInconsistencyException.
segues de desenrollado2012-10-01 10:56:33.627 UnwindSegues[12770:c07] *** Assertion failure in -[UIStoryboardUnwindSegueTemplate _perform:], /SourceCache/UIKit_Sim/UIKit-2372/UIStoryboardUnwindSegueTemplate.m:78
2012-10-01 10:56:33.628 UnwindSegues[12770:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not find a view controller to execute unwinding for <USCustomContainerViewController: 0x75949a0>'
*** First throw call stack:
(0x1c8e012 0x10cbe7e 0x1c8de78 0xb61f35 0x581711 0x45ab54 0x10df705 0x16920 0x168b8 0xd7671 0xd7bcf 0xd6d38 0x4633f 0x46552 0x243aa 0x15cf8 0x1be9df9 0x1be9ad0 0x1c03bf5 0x1c03962 0x1c34bb6 0x1c33f44 0x1c33e1b 0x1be87e3 0x1be8668 0x1365c 0x1e7d 0x1da5)
libc++abi.dylib: terminate called throwing an exception
Alguien ha utilizado con éxito combinan con las APIs de vista del controlador de contención? ¿Alguna idea de qué paso me estoy perdiendo? Cargué un demo project to github que muestra el problema en el proyecto de demostración más simple que pude encontrar.
Para referencia: http://openradar.appspot.com/radar?id=2144402 –