2010-06-22
Viewが表示されなかった時のチェック項目
Tips |
Viewが表示されない原因には「Viewそのものにあるケース」、「ViewControllerにあるケース」、「その他」がある。
ここに書いたのはViewに原因があるケースを想定した、いわゆるポカミス用のチェックリスト。
分かってしまえば単純だが、チェック箇所が多いので見落としのないようにしたい。
※なお、ここではIBを利用せずにアプリを作っているケースを想定している。(IBを使った場合には、ソースファイル以外の場所を色々チェックしなくてはいけないのでバグつぶしで心が折れる。私には無理っぽい)
対象のSubViewそのものに原因がある場合
- インスタンスが作成されているか。
- frameを設定しているか。
- layoutSubviews など他のメソッドでframeを設定する処理になっている場合には、そちらのメソッドが呼び出されているか。
- frameに与える値が適当か、NSLogでチェック。(Viewの表示位置が正しくないケースなので、下記はレイアウト崩れにも共通して言える)
- 親viewのboundsを元に対象viewの表示位置を算出している場合、親viewの座標に誤りがあれば、その子にも連鎖する。UIScreen mainScreen] bounds];なら確実。
- viewのboundsは小刻みに変動するケースがあるので注意。デバイスの回転などで起きる自動レイアウト変更の影響による。
- 加えて言えば、シミュレータのバグにも注意。デバイス回転を繰り返すと、挙動が怪しくなり、誤った値を返すことがある。(怪しいと思ったら、実機でテスト)
- 適切なViewにaddSubViewをしているか。
- 親のViewが表示されているか。表示されていなければ、(対象Viewではなく)その親Viewに原因あり。
SubView:その他のチェック項目
- Viewのライフサイクルは正常に管理されているか。(一般的なメモリ管理のチェック項目。単純だが数が多いので注意)
- SubViewには多くの簡易コンストラクタ(alloc ではなく、hogeWith~など)が用意されている。誤って手動でreleaseしていないか。
- 手動retain、もしくはプロパティによる保持が行われているか。
- 【プロパティによる保持】self.hogeButton = fugaButton; と書くべきところを、hogeButton = fugaButton;と書いてしまうケース。ドット演算子を利用しない場合にはインスタンス変数と解釈され、プロパティ経由でアクセッサが利用されず、retainが施されない。
親Viewに問題がある場合
ここでは、windowに直接addSubViewされる大元のViewに問題がある場合のチェック項目を羅列する。
- インスタンスが作成されているか。(上と同じ)
- frameを設定しているか。(上と同じ)
- windowにaddSubViewされているか。[window addSubView:hogeView];が必要。
- 対象Viewが他Viewの後ろに隠れていないか。[window bringSubviewToFront:hogeView];が必要。
View以外に原因
- Windowに原因
- Windowが makeKeyAndVisible されているか。
- ViewControllerに原因
- ViewController側で余計なこと(通知をフックして放置するなど)をしていないか。
- 原因の切り分け、詳細状況の把握のために、強制的に描画イベントを発生させて(windowに対して addSubViewが行われたとき。画面のRotateが発生した。setNeedsDisplayメソッドあたり?)挙動を確かめる手もある。
2010-06-13
iPhone/iPadアプリ開発で実機テストができなくなった時のチェック項目一覧
Tips |
一度は出来ていたのに、アプリが実機で走らなくなってしまった。
そんな時の確認項目一覧。
☆は、意外にこれで回復することってあるね という項目。
- 確認作業
- ☆Xcode上の設定に誤りはないか確認
- Xcode上で確認すべき項目は後述。
- 原因追求のため、hello worldのプロジェクトを作ってみる。
- 新規プロジェクトではiPad用のWindow-based Application。IBでは、Main WindowにHello Worldのlabelのみを貼りつけたものあたり。
- もちろん、シミュレータ上で正常動作することを確認すること。
- ☆Xcodeのオーガナイザーから全てのprovirioningを削除し、Provisioning Portalから再度ダウンしたProfileデータをXcodeのオーガナイザーで設定する。
- 期限切れによるProfileデータ入れ替えタイミングでトラブルが起きた時に、シミュレータでは動くけど実機では…という状況に陥るケースがあるようです。
- Provisioning PortalでProfileデータを新規作成して、Xcodeのオーガナイザーで設定する。
- ☆Xcode上の設定に誤りはないか確認
- 確認すべきXcode側の設定項目
上記の他に私が経験した例では、下記のパターンがあった。
トラブルと言うより、実機テストの仕様を私が知らなかっただけのような気がするのだが、一応ご参考まで。
2010-06-11
シミュレータを信用してはいけないケース - もんたメソッド開発(その3)
もんたメソッド |
画面の回転に対応するための処理を書いていたが、シミュレータの挙動がおかしい。
Ctrl+→キー(画面を時計まわりに回転)、 Ctrl+←キー(画面を反時計まわりに回転)を何度か押していると、シミュレータは"どの方向を向いてますよ"の値を間違えて返すようになる。
不思議に思い実機でテストしたら、何も問題なし。きちんと見た通りの画面の向きを返してくれた。
色々なところで言われているが、シミュレータの挙動は参考程度に留めておいた方が良い。
2010-06-02
もんたメソッド for iPadの開発(その2)
もんたメソッド |
構成
構成はWebViewの上に文字とシールをHTML、CSSで表現する方向でひとまず決定。
テキストとグラフィックで実装する場合に比べて表現力が劣ってしまうがここはHTMLのチカラを信じることにする。
画面プロトタイプ作成 「プレゼン実演画面」
プレゼン実演画面とはあらかじめ作成したプレゼン原稿をお披露目する画面のこと。
初日の数時間ほどで、原稿からシールを剥がすインタラクションを完成させる。久々のObjective-Cだが、WebViewを使ったおかげでリッチテキストの扱いは簡単、完璧。
画面プロトタイプ作成 「プレゼン原稿作成画面」
問題となる原稿作成画面のプロトタイプ作成へと移った。
……JavaScript弱いんだよなぁぁぁ。
以来、オライリー2冊とのにらめっこを続けている。