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.
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