2012-05-17 10 views
7

que encontré recientemente una situación tirones de pelo en mi aplicación de iOS, donde yo estaba tratando de despedir sucesivamente uno presentó UIViewController de RootViewController de mi ventana, usando:sucesivas llamadas al método presentViewController de UIViewController

[rootViewController dismissViewControllerAnimated:YES completion:NULL] 

y presentar otra poco después (en otro método, dicho sea de paso), con:

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

el problema era que nunca podría conseguir el segundo controlador de vista a aparecer. Resulta que, por lo que puedo decir, dismissViewControllerAnimated:completion: necesita ese bloque asincrónico de tiempo de "finalización" para pasar, antes de que presentViewController:animated:completion: funcione correctamente de nuevo. Este hecho no está directamente documentado en Apple's docs, por lo que puedo decir.

La solución que se me ocurrió fue para envolver el despido con un método que especifica el selector que se desea llamar después, de este modo:

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

Y entonces me llamaría:

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

De todos modos, quería publicar, ya que miré a mi alrededor y no había visto a nadie con este problema en particular, así que pensé que podría ser útil que la gente lo entendiera. Y también, quería verificar que no estoy pirateando una solución que tiene un mejor patrón de diseño para la resolución.

Respuesta

2

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]; 
}]; 
+0

Creo que el código debería funcionar. Mi ejemplo fue usar presentViewController como la llamada de seguimiento, pero supongo que encontraría el mismo problema con su código si, en lugar de tomar medidas en el bloque de finalización, lo hiciera: '[myRootViewController dismissViewControllerAnimated: YES completion: NULL ]; [myRootViewController pushViewController: newController animado: SÍ]; ' – KevinH

Cuestiones relacionadas