2012-05-17 56 views
7

連續調用我最近遇到一個頭發拉扯的情況在我的iOS應用程序,在那裏我試圖先後解僱一個從我的窗口RootViewController的呈現UIViewController,使用:到UIViewController的presentViewController方法

[rootViewController dismissViewControllerAnimated:YES completion:NULL] 

,並提出一個又一個此後不久(在另一種方法,順便說一句),具有:

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

問題是,我永遠無法得到第二視圖控制器來顯示。原來,據我所知,dismissViewControllerAnimated:completion:需要「完成」時間的異步塊通過,在presentViewController:animated:completion:將再次正常工作之前。據我所知,這個事實並沒有直接記錄在Apple's docs中。

我想出瞭解決的辦法是與指定你想以後調用,像這樣的選擇的方法來包裝解僱:

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

然後我會打電話:

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

無論如何,我想張貼,因爲我環顧四周,並沒有看到任何人有這個特殊問題,所以我認爲這可能是有用的人瞭解。而且,我想驗證我沒有竊聽具有更好的解決方案設計模式的解決方案。

回答

2

只是爲了清楚起見。你是說這段代碼不起作用嗎?

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

我相信代碼應該工作。我的例子是使用presentViewController作爲後續調用,但我會假設你會遇到與你的代碼相同的問題,而不是在完成塊中採取行動,你做了: '[myRootViewController dismissViewControllerAnimated:YES completion:NULL ]。 [myRootViewController pushViewController:newController animated:YES];' – KevinH

相關問題