2012-05-17 18 views
7

Recentemente ho incontrato una situazione tirate di capelli nella mia app iOS, in cui stavo cercando di respingere successivamente quello presentato UIViewController da RootViewController di mia finestra, utilizzando:successive chiamate di metodo presentViewController di UIViewController

[rootViewController dismissViewControllerAnimated:YES completion:NULL] 

e presentare un altro poco dopo (in un altro metodo, per inciso), con:

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

il problema era, non avrei mai potuto ottenere il secondo controller della vista di presentarsi. Risulta, per quanto posso dire, che dismissViewControllerAnimated:completion: ha bisogno del blocco asincrono del "completamento" per passare, prima che presentViewController:animated:completion: funzioni di nuovo correttamente. Questo fatto non è direttamente documentato in Apple's docs, da quello che posso dire.

La soluzione mi è venuta è stato quello di avvolgere il licenziamento con un metodo che specifica il selettore si vorrebbe chiamare in seguito, in questo modo:

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

E poi mi avrebbe chiamato:

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

In ogni caso, ho voluto postare, mentre mi guardavo intorno e non avevo visto nessuno con questo particolare problema, quindi ho pensato che potesse essere utile per le persone a capire. Inoltre, volevo verificare che non stia creando una soluzione che abbia un modello di progettazione migliore per la risoluzione.

risposta

2

Solo per motivi di chiarezza. stai dicendo che questo codice non funziona?

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

Credo che il codice dovrebbe funzionare. Il mio esempio stava usando presentViewController come chiamata di follow-up, ma supponevo che avresti incontrato lo stesso problema con il tuo codice se, invece di agire nel blocco di completamento, hai fatto: '[myRootViewController dismissViewControllerAnimated: SÌ completamento: NULL ]; [myRootViewController pushViewController: newController animato: YES]; ' – KevinH

Problemi correlati