親ViewControllre(UISplitViewControllerやUINavigationController)が持つ
子ViewControllerにて画面遷移、または画面表示を実行する場合、
わざわざ親ViewControllreを呼び出して、実行させていたが、
showViewController、showDetailViewControllerを使えば、
親ViewControllreを呼び出すことなく実行できる
showViewController:sender:
-
UISplitViewControllerの子ViewControllerの場合
引数で渡すViewControllerがprimary側のViewControllerに置き換わる
-
UINavigationControllerの子ViewControllerの場合
引数で渡すViewControllerがPushで画面遷移する
-
親ViewControllerを持たないただのViewControllerの場合
引数で渡すViewControllerがモーダルで表示される
showDetailViewController:sender:
-
UISplitViewControllerの子ViewControllerの場合
-
horizotal size classがregularの場合(分割表示)
引数で渡すViewControllerがsecondary側のViewControllerに置き換わる
-
horizotal size classがcompactの場合(1画面表示)
引数で渡すViewControllerがモーダルで表示される
ただし、primary側がNavigationControllerの場合、pushで画面遷移する
-
-
UINavigationControllerの子ViewControllerの場合
メソッドなし。
-
親ViewControllerを持たないただのViewControllerの場合
引数で渡すViewControllerがモーダルで表示される
targetViewControllerForAction:sender:
親ViewController(UISplitViewControllerやUINavigationControllerなど)が指定したメソッドを実装しているか取得する。
ない場合、見つけるまで親をたどっていく。
showViewControllerやshowDetailViewControllerでは、
内部で、このメソッドが呼び出している。
> UISplitViewController
> ↑
> UINavigationController
> ↑
> UIHogeViewController
上記のようなツリーのコンテナ構造の場合、
UIHogeViewControllerでshowViewControllerを実行すると、
一つ親のUINavigationControllerのshowViewControllerがあるか
targetViewControllerForActionでチェックする。
UINavigationControllerには実装されているので、
UINavigationControllerのshowViewControllerが実行される。
しかし、showDetailViewControllerの場合、
UINavigationControllerには実装されていないので、
さらにもうひとつ上のUISplitViewControllerをチェックする。
UISplitViewControllerは実装されているので、そのshowDetailViewControllerが実行される。