7

私は最近、iOS アプリで髪を引っ張る状況に遭遇しました。そこではUIViewController、次を使用して、ウィンドウの rootViewController から提示されたものを連続して閉じようとしていました。

[rootViewController dismissViewControllerAnimated:YES completion:NULL]

その後すぐに別のものを提示します(ちなみに、別の方法で)。

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

問題は、2 番目のビュー コントローラーを表示できないことでした。私が知る限り、再び適切に機能するdismissViewControllerAnimated:completion:前に、「完了」時間の非同期ブロックが必要であることがわかりました。この事実は、私が知る限り、 Apple のドキュメントpresentViewController:animated:completion:には直接記載されていません。

私が思いついた解決策は、後で呼び出したいセレクターを指定するメソッドで解雇をラップすることでした。

- (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)];

とにかく、私は周りを見回して、この特定の問題を抱えている人を見たことがなかったので、投稿したかったので、人々が理解するのに役立つかもしれないと思いました. また、解決のためのより優れた設計パターンを持つソリューションをハッキングしていないことを確認したかったのです。

4

1 に答える 1

2

わかりやすくするために。このコードは機能しないと言っていますか?

[myRootViewController dismissViewControllerAnimated:YES completion:^{
    [myRootViewController pushViewController:newController animated:YES];
}];
于 2012-06-13T18:30:29.127 に答える