Llamadas sucesivas al método presentViewController de UIViewController

Hace poco me encontré con una situación difícil en mi aplicación de iOS, donde estaba intentando descartar sucesivamente un UIViewController presentado del UIViewController de mi window, usando:

 [rootViewController dismissViewControllerAnimated:YES completion:NULL] 

y presentar otro poco después (en otro método, por cierto), con:

 UIViewController *vc2 = [[[MyViewController2 alloc] initWithNibName:nil bundle:nil] autorelease]; [rootViewController presentViewController:vc2 animated:YES completion:NULL]; 

El problema fue que nunca pude ver el segundo controller de vista. Resulta, tan cerca como puedo decir, dismissViewControllerAnimated:completion: necesita que el bloque asynchronous de time de "finalización" pase, antes de presentViewController:animated:completion: funcionará correctamente nuevamente. Este hecho no está documentado directamente en los documentos de Apple , por lo que puedo decir.

La solución que se me ocurrió fue envolver el despido con un método que especifica el selector al que desea llamar posteriormente, así:

 - (void)dismissViewController:(UIViewController *)presentingController postAction:(SEL)postDismissalAction { [presentingController dismissViewControllerAnimated:YES completion:^{ [self performSelectorOnMainThread:postDismissalAction withObject:nil waitUntilDone:NO]; }]; } 

Y luego llamaba:

 [self dismissViewController:self.window.rootViewController postAction:@selector(methodForNextModalPresentation)]; 

De todos modos, quería publicar, mientras miraba a mi alnetworkingedor y no había visto a nadie con este problema en particular, así que pensé que podría ser útil para que la gente lo entienda. Y también, quería verificar que no estoy hackeando una solución que tenga un patrón de layout mejor para la resolución.

Solo por el bien de la claridad. ¿Estás diciendo que este código no funciona?

 [myRootViewController dismissViewControllerAnimated:YES completion:^{ [myRootViewController pushViewController:newController animated:YES]; }];