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