modalによる画面遷移

modal試しました

ちなみにここで記述されているソースコードは次の書籍を参考にしています。興味がある方はご一読をおすすめします。

modalを表示

modalを呼び出します。
これは呼び出す側でmodalにしたいViewControllerのインスタンスを作成しておけば良いです。

modalViewをreleaseするタイミングを自分で考えずに済むのでautoreleaseを使用します。

modalを隠す

modalを消す必要があるので、modalとなっているViewにcloseボタンを用意します。
このcloseボタンが押された場合、modalとなっているViewControllerに通知が行われます。

ここでmodalとなったViewControllerを隠すにはdismissModalViewControllerAnimatedを呼ばなければなりません。

dismissModalViewControllerAnimatedを呼ぶのは誰?

ふつうに考えるとmodalとなったViewControllerが自分でdismissすればいいような気もします。
そうすると後ろに隠れていた呼び出し元のViewが表示されるので問題が無いように思えます。

そうでない場合もある

modalでデータを変更していて、その結果を呼び出し元に反映する必要がある場合

この場合はmodalが隠れてしまう前にデータを書き換えたとします。
そうすると呼び出し元がその修正結果を反映するために画面を再描画する必要があります。

こんなかんじの時

呼び出し側のViewControllerに属するviewを表示。

modalボタンを押下。そうすると呼び出し側のViewControllerに加えてmodalのViewControllerが表示されます。

closeボタンを押下。modalのViewControllerインスタンスが破棄されます。modalでの操作が呼び出し側のViewに影響する場合、呼び出し側のViewControllerがその事を察知して、自身のViewをupdateする必要があります。

Best Practice

ちょっと面倒なのですが、modalとなっているViewControllerの管理下にあるView上に配置されているcloseボタンが押されたら、以下の処理を行います。

  • modalとなっているViewControllerのcloseDidPushメソッドへcloseボタンが押された事を通知する
  • 上記メソッド内で呼び出し元へ通知
  • 呼び出し元となっているViewControllerがdismissModalViewControllerAnimatedを実行する

つまり、delegateを使います。
このような記述方法が必要ない場合もあると思いますが、必要な場合とそうでない場合とで記述が異なると保守性の問題がでてくるので
いつでも同じパターンにしておいたほうが良いのかもしれません。

どちらかというとActionSheetのように画面を閉じる際に複数の選択肢がある場合の処理で使われるのでそれに合わせて記述する習慣がおすすめ、という感じかも。

おまけ

今日のモテ曲*1

買ってくれ。頼む。
Othello & The Hipknotics Classic

*1:効用には個人差がございます