9VAeきゅうべえiPad版を開発中。パソコンアプリからの移植がだいぶできてきたが、対応の難しい点がいくつか残っている。大きなのは次の2つだ
- YesNo入力待ちが使えない。
- ファイル開く、保存するダイアログがない。
YesNo入力待ちができない問題
YesNo入力待ちというのは、アプリの途中でユーザーの確認を求めて、続きの処理を切り替える機能だ。例えば、「ファイルを上書きしても良いですか?はい、いいえ、キャンセル」で、後の処理を切り替える。
昔のパソコンアプリでは、こういう書き方をよくしていた。
iOS(最近のアプリの作り方)の場合、こういったアラートを表示することはできるが、その結果を受け取るまで、プログラムを止めておいて、結果を受け取ってから続きの処理を行う。ということができない。プログラムを独立性の高い小さなモジュールに分けて作りなさいということかな。
そうなので、ユーザー入力待ちが発生すると、その直前までの処理と、入力した後の処理を分離し、ユーザー入力のあと、新たに続きの処理を開始ということにしないといけない。ところが、最初からそういう設計にしておかないと、入力待ちが発生した時の途中の状態がわからなくなり、「とにかく、この続きをやりたい」ということになってしまう。また、最初は入力待ちがなかった場所に、後から入力待ちを入れて処理を分けるということもある。パソコンアプリである 9VAeには、そんなYesNoがあちこちに入っていて、今更処理を分けるのは大変である。
そこで、YesNoアラートの結果が出るまで、じっと待っていて、結果を受け取ってから元の場所に戻るというプログラムを作ろうとしたが、失敗した。別のスレッドで、アラートだけ表示し、その結果を受け取るまで、ループ待ちする、といった裏道を試してみたが、うまく動作しなかった。
それで、結局、次のようにした。
- YesNoアラートでは、とりあえず、1回目はキャンセルする。その時、もう一度実行するにはどこから実行すれば良いかを覚えておく。
- YesNoアラートを表示して結果を取得する。
- 最初に覚えておいた場所からもう一度実行する。到達したYesNoでは、その結果を与えて続きを実行する。
- プログラム中の全ての YesNoアラートにこの処理を入れる。
これで、かなりの処理は解決できたが、YesNo分岐を連続して行なっている箇所があった。その場合、途中から上手に実行できない。うむむ
とりあえず、うまくできたところもある。ファイルを閉じる時に、保存するかどうか尋ねる画面。この入力結果によって続きの処理を変える。