iOS

Swift4:モーダルの制御の仕方

storyboardで定義したそれぞれのモーダル画面を制御するときのひとつのアイデアです。

単にモーダルアラートを表示したり、メイン(ViewController)側で指示した通りにモーダル画面を表示する場合でも、

  • メイン側の画面の内容を参照したい。たとえば、ボタンに意味を持たせているようなケースでは同じボタン表示をしたいし、言語ボタンの内容が英語と日本語のどちらかなどの判定をしたい。
  • 呼び出し元でそれぞれのモーダル画面に対して何回も同じ内容を設定しないといけないのは面倒。

というような問題があります。

問題解決のためのアイデア: 共通エリア

  1. ひとつは、各モーダル画面のclassの中で受け渡しパラメータを定義せず、モーダル共用エリアを定義することで、それぞれのモーダル画面・機能に対して共有できるパラメータと固有パラメータを引き渡すことができます。
  2. こうすることで、子側で親側の画面を参照できます。また、機能的な独立性をどう担保するかという問題はありますが、ほかのモーダル画面・機能で設定した内容も参照したり、変更することができます。

もうひとつは、

  • モーダル画面側でユーザーが設定した内容により、自動的に次の画面を表示したい場合、たとえば、エンコード選択なら、次のURL読み込みに間に合えばいいので結果だけ返せばいいのですが、ブックマークを選択するモーダル画面では、URLを決定したら、ただちにその画面を表示する必要があります。

問題解決のためのアイデア: プログレスタイマー

  1. プログレスのタイマー管理で子側のモーダル画面側で設定するパラメータを監視することでこの問題は解決できます。
  2. たとえば、子側がブックマークを選択するモーダル画面でURLを決定したら、プログレスのタイマー管理で変化を監視してこのURLを読み込むようにしておけば、問題解決です。

Screenshot 2018-02-28 09.16.08

@IBOutlet weak var xProgress: UIProgressView! //プログレス

Screenshot 2018-02-28 10.33.37

共通エリア(呼び出し元処理はほかのモーダルと同じ)

Screenshot 2018-02-28 10.44.48

共通エリア

Screenshot 2018-02-28 10.49.32

Categories: iOS, Swift, 技術