MD Blog

誰かの何かに役に立てることを書いていきたいです

テスト用UIViewと本番用UIViewを使って開発する(iOS)

iOS用アプリの開発をしているとき、仮のUIViewを使いたいことがあると思います。

例えば、凝ったジェスチャーで何らかのアクションをトリガーしたいけどまだジェスチャーを実装できてないときに、簡単なボタンを設置してアクショントリガーしてテストしたいとか。

あるいは、ロジック部分を先に作っておいて後からUIを作り込みたいときに、とりあえずテスト用のViewで開発したいなど。

 

 テスト用のViewと本番用のViewを用意して、切り替えながら開発する方法を僕は3つ思い付きました。

 

1. インスタンス変数にtestModeなどのBOOL値を用意して、この値を入れ替える。

2. テスト用Viewを用いるTargetを作って、Xcode上で切り替える。

3. Objectionを用いる。

 

テスト用Viewと本番用Viewの切り替えはできるだけコード以外のところで行いたいので1は却下。

3のObjectionは、DIという思想を実現するためのフレームワークで、"コンポーネント間の依存関係をプログラムのソースコードから排除し、外部の設定ファイルなどで注入できるように"するものです(by Wikipedia)。

本当はこれを使ってみたくて途中まで試してみましたが、制約が多くてViewの切り替えには向いていなかったので断念。

(あるオブジェクトの注入数を動的に決められないなど。なのでUITableViewCellをうまく注入できなかった。)

 

そこで今回、比較的手軽に、かつコードへの依存も少ない2の方法を用いることにしました。

 

Step1. テスト用UIViewを用意する

本番用のUIViewを継承してテスト用UIViewを作ります。

このとき、テスト用UIViewにボタンを作るときはアクションのターゲットを本番用のUIViewにしましょう。

そうすれば、アクション部分は本番用のUIView一か所に書いておけば済みます。

 

Step2. テスト用Targetを作る

以下のサイトを参考にして作ってみてください。このサイトでは有料無料の切り替えを行なっていますが、要領は同じです。

[iPhoneアプリ開発] 無料版と有料版を同じXcodeプロジェクトで作る - func09

http://www.func09.com/wordpress/archives/859

 

Step3. テスト用と本番用を切り替えるためのプリプロセッサ命令(#ifdefとか)をUIViewControllerに書く

これも上記サイトを参照してほしいのですが、ポイントはUIViewContorllerに記述しましょうということです。

理由は単純で、その名の通りViewをControlするクラスに記述したほうがコードを理解しやすくなるからです。

 

以上の方法を試しはじめてから、ロジック部分とUI部分の開発を分けて行うことができるようになって開発が楽になった気がします。

どうぞ参考にしてみてください。