dismissViewControllerAnimatedメソッドがよくわからない

2つ目のiOSアプリケーション:ストーリーボードを写経している中で、dismissViewControllerAnimated, dismissModalViewControllerAnimatedというメソッドがでてきました。新しく作成したシーンを MasterViewController とつなげる部分のようですが、Delegate も絡んできているためなかなか理解できません。そこでちょっと情報を集めてみました。

iOS View Controllerプログラミングガイドに P105「View Controller間の連携」という章がありました。この部分を呼んでいると「2つ目のiOSアプリケーション」の引用がよくでてきます。ちょうど詳細説明になっていて良い感じです。でもこれって dismissViewControllerAnimatedメソッドについて記述されているわけじゃないですね。「デリゲーションを使ってほかのコントローラと通信する」という部分でビューを閉じるためにコールしてるだけみたいでした。

こう考えると、やっぱりビューを閉じるために dismissViewControllerAnimated を呼んでいるという風に理解するのがよさそうですね。

更に調べていくと、iOS 6 からは dismissModalViewControllerAnimatedメソッドは is duplicated になってるみたいです。確かに UIViewController.h をみるとそう宣言されてますね。

// Dismiss the current modal child. Uses a vertical sheet transition if animated. This method has been replaced by dismissViewControllerAnimated:completion:
- (void)dismissModalViewControllerAnimated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);

代替手段を探してみると、結局 dismissViewControllerAnimated を使えばいいみたいです。

写経の実装もそのようになおしてみたところ、問題なく動作しました。

- (void)addSightingViewControllerDidFinish:(AddSightingViewController *)controller name:(NSString *)name location:(NSString *)location
{
    if ([name length] || [location length]) {
        [self.dataController addBirdSightingWighName:name location:location];
        [[self tableView] reloadData];
    }
    //[self dismissModalViewControllerAnimated:YES];
    [self dismissViewControllerAnimated:YES completion:nil];
}

また別の実装として、Unwind Segue を使うという方法もあるようですね。詳しくはこちらを御覧ください。こちらの実装方法の方がしっくりくるようにも感じました。Delegate があると自分はどうも理解し難いようです。

結局 dismissViewControllerAnimated が何者であるかは調査しきれませんでしたが、ビューを閉じる動きについては多少理解できたように思います。