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 を使えばいいみたいです。
- http://stackoverflow.com/questions/12640810/dismissmodalviewcontrolleranimated-is-deprecated-first-deprecated-in-ios-6
- http://minnatomodachi.net/2012/10/30/presentmodalviewcontroller4ios6/
写経の実装もそのようになおしてみたところ、問題なく動作しました。
- (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 が何者であるかは調査しきれませんでしたが、ビューを閉じる動きについては多少理解できたように思います。