Ich traf vor kurzem eine Haarzieh Situation in meinem iOS-App, wo ich versucht wurde nacheinander eine UIViewController
aus meinen Fenstern RootViewController präsentiert zu entlassen, mit:Aufeinanderfolgende Aufrufe von UIViewController des presentViewController Methode
[rootViewController dismissViewControllerAnimated:YES completion:NULL]
und präsentieren ein anderes kurz danach (in einem anderen Verfahren, nebenbei bemerkt), mit:
UIViewController *vc2 = [[[MyViewController2 alloc] initWithNibName:nil bundle:nil] autorelease];
[rootViewController presentViewController:vc2 animated:YES completion:NULL];
Problem war, konnte ich nie die zweiten view-Controller bekommen zu zeigen. Stellt sich heraus, so nah wie ich sagen kann, dismissViewControllerAnimated:completion:
benötigt, dass asynchroner Block der "Fertigstellung" Zeit vergeht, bevor presentViewController:animated:completion:
wird wieder richtig funktionieren. Diese Tatsache ist nicht direkt in Apple's docs dokumentiert, von dem, was ich sagen kann.
Die Lösung kam ich mit war die Entlassung mit einem Verfahren zu wickeln, das die Auswahl bestimmen Sie danach rufen wollen würden, etwa so:
- (void)dismissViewController:(UIViewController *)presentingController
postAction:(SEL)postDismissalAction
{
[presentingController dismissViewControllerAnimated:YES
completion:^{
[self performSelectorOnMainThread:postDismissalAction
withObject:nil
waitUntilDone:NO];
}];
}
Und dann würde ich nennen:
[self dismissViewController:self.window.rootViewController
postAction:@selector(methodForNextModalPresentation)];
Wie auch immer, ich wollte posten, als ich mich umschaute und niemanden mit diesem speziellen Problem gesehen hatte, also dachte ich, es könnte nützlich sein, damit die Leute es verstehen. Außerdem wollte ich überprüfen, dass ich keine Lösung hacke, die ein besseres Entwurfsmuster für die Auflösung hat.
Ich glaube, dass Code funktionieren sollte. In meinem Beispiel wurde presentViewController als Folgeaufruf verwendet, aber ich nehme an, dass Sie das gleiche Problem mit Ihrem Code haben würden, wenn Sie statt der Aktion im Abschlussblock Folgendes getan hätten: '[myRootViewController dismViewControllerAnimated: YES completion: NULL ]; [myRootViewController pushViewController: newController animiert: YES]; ' – KevinH