Hatena::Groupiphone-dev

勢いでMacを買っちゃったんで iPhoneアプリ頑張って開発する

2010-06-22

Viewが表示されなかった時のチェック項目

| 21:20


Viewが表示されない原因には「Viewそのものにあるケース」、「ViewControllerにあるケース」、「その他」がある。

ここに書いたのはViewに原因があるケースを想定した、いわゆるポカミス用のチェックリスト。

分かってしまえば単純だが、チェック箇所が多いので見落としのないようにしたい。

※なお、ここではIBを利用せずにアプリを作っているケースを想定している。(IBを使った場合には、ソースファイル以外の場所を色々チェックしなくてはいけないのでバグつぶしで心が折れる。私には無理っぽい)

対象のSubViewそのものに原因がある場合

  1. インスタンスが作成されているか。
  2. frameを設定しているか。
    • layoutSubviews など他のメソッドでframeを設定する処理になっている場合には、そちらのメソッドが呼び出されているか。
    • frameに与える値が適当か、NSLogでチェック。(Viewの表示位置が正しくないケースなので、下記はレイアウト崩れにも共通して言える)
      • 親viewのboundsを元に対象viewの表示位置を算出している場合、親viewの座標に誤りがあれば、その子にも連鎖する。UIScreen mainScreen] bounds];なら確実。
      • viewのboundsは小刻みに変動するケースがあるので注意。デバイスの回転などで起きる自動レイアウト変更の影響による。
      • 加えて言えば、シミュレータのバグにも注意。デバイス回転を繰り返すと、挙動が怪しくなり、誤った値を返すことがある。(怪しいと思ったら、実機でテスト)
  3. 適切なViewにaddSubViewをしているか。
    • 親のViewが表示されているか。表示されていなければ、(対象Viewではなく)その親Viewに原因あり。

SubView:その他のチェック項目

  1. Viewのライフサイクルは正常に管理されているか。(一般的なメモリ管理のチェック項目。単純だが数が多いので注意)
    • SubViewには多くの簡易コンストラクタ(alloc ではなく、hogeWith~など)が用意されている。誤って手動でreleaseしていないか。
    • 手動retain、もしくはプロパティによる保持が行われているか。
    • プロパティによる保持】self.hogeButton = fugaButton; と書くべきところを、hogeButton = fugaButton;と書いてしまうケース。ドット演算子を利用しない場合にはインスタンス変数と解釈され、プロパティ経由でアクセッサが利用されず、retainが施されない。

親Viewに問題がある場合

ここでは、windowに直接addSubViewされる大元のViewに問題がある場合のチェック項目を羅列する。

  1. インスタンスが作成されているか。(上と同じ)
  2. frameを設定しているか。(上と同じ)
  3. windowにaddSubViewされているか。[window addSubView:hogeView];が必要。
  4. 対象Viewが他Viewの後ろに隠れていないか。[window bringSubviewToFront:hogeView];が必要。

View以外に原因

  1. Windowに原因
    • Windowが makeKeyAndVisible されているか。
  2. ViewControllerに原因
    • ViewController側で余計なこと(通知をフックして放置するなど)をしていないか。
    • 原因の切り分け、詳細状況の把握のために、強制的に描画イベントを発生させて(windowに対して addSubViewが行われたとき。画面のRotateが発生した。setNeedsDisplayメソッドあたり?)挙動を確かめる手もある。

ゲスト



トラックバック - http://iphone-dev.g.hatena.ne.jp/ID2nd/20100622