2012-05-17 6 views
7

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.

Antwort

2

Nur aus Gründen der Klarheit. sagst du, dass dieser Code nicht funktioniert?

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

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

Verwandte Themen