iOS画面遷移のアンチパターン:複数画面一気に戻る場合はmodal遷移使わない

UINavigationController使って、pushで進んでいくべき。

いや、UINavigationControllerてそのためにあるんだから当たり前じゃんと言われそうだけど、ところがどっこい遷移アニメーションがmodalの方がいいときとかはそっち使ってしまうことがよくある。だが時間が経つとメンテナンスでコストかかるのでちゃんとnavigation使うべき。

 

f:id:yuma_nishizaki:20150606014915p:plain

 

例えば、図でEからAに一気にもどる必要があるとき、EでpresentingViewControllerを2回呼べばCが手に入るので、そこからnavigationController取得してpopToRootすればAに戻れるけど、これってEが画面遷移の知識をすべて持ってしまっているので、Eと画面遷移の間に依存関係ができてしまっていて、非常によくない。

f:id:yuma_nishizaki:20150606015244p:plain

全部pushならEから直接navigationController取得できるので、画面遷移の知識に依存する必要がなくなる。

ViewControllerとかクラス単位では(言語レベルで)ちゃんと隠蔽されているので、1画面内でなにやっても外に依存が行ってしまうことはあまりないけど、画面遷移の知識はフレームワークレベルでうまく隠蔽できてないので、うっかりしてるとがっつりと依存関係をつくってしまうことになりうるから注意。

 

更新:

navigationのpopToRootView使うって行っても、やはりviewController Eが「自分はnavigationの中に入っている」という知識を持ってしまうので、Eを再利用しようとしたときにnavigationの中以外では使えなくなってしまうという意味であまりよくない。

Storyboardのunwindsegueはこういう時に使うといいんだと思う。

Aへ戻るunwindsegueはAのメソッドとして宣言するので、EにAに戻るためだけのコードを書くわけではないのでpopToRootViewよりいいし、多分unwindsegueってAに対してのみメッセージ送ってるわけではなくて、ブロードキャストしてるんだと思うので、そういう意味でもAとEの依存性低減にいい。