StoryBoardを使用してUIを構築している場合で確認しました。
親ビューからモールダイヤログを開き、そのダイアログから更にモーダルダイアログを開いている場合で、何かしらのユーザーアクション時に、一気に親ビューまで戻りたい時がありました。
通常は、モーダルビュー内で、以下のように親ビューに戻れます。
[self dismissViewControllerAnimated:YES completion:nil];
2段を一気に戻りたい場合は、
まずは、delegateメソッドを実装して、親ビューのメソッドを呼び出せるようにします。
(この方法は色々なサイトに書いてあるので省略します)
ここで、普通に、viewWillDisappearで
[delegate hogeHoge];
などと、親のモーダルビューのメソッドを呼びだし、そこで、
[self dismissViewControllerAnimated:YES completion:nil];
と書いてもエラーが出て動きません。
Attempt to dismiss from view controller … while a presentation or dismiss is in progress!
などとエラーが表示されで1枚しか戻りません。
(閉じている途中に閉じれないよ!という意味のエラー)
なるほど、ここで安直にアニメーションをOFFにしてもダメですw
以下の方法で動作します。
[self dismissViewControllerAnimated:YES completion:^{ if([delegate respondsToSelector:@selector(hogeHoge:)]){ [delegate hogeHoge:param1]; }else{ NSLog(@"hogeHogeメソッドが未実装!"); } }];
※1枚目のhogeHogeでも上記と同じ事をします。
completionはその為にあったのか!
と勝手にナットクしましたが、もっとスマートな方法もあるのかもしれません。