LoginSignup
32
40

More than 5 years have passed since last update.

UIViewController の設計指針

Posted at

主に Interface Builder を使用せずガリガリコーディングする人向け。基本的には UIViewController のマニュアルを読めって感じなのだが...

ビューコントローラーの初期化

- initWithNibName:bundle:

すべきこと:

  • 必要な全プロパティの初期化 (view プロパティを除く)

すべからざること:

  • view プロパティの初期化

ビュー

view プロパティ

このプロパティのゲッターは普通のゲッターではない。view が未初期化の時にゲッターを呼ぶと、中で loadViewviewDidLoad が呼ばれ、結果のビューが返される。

ビューが初期化済みかどうか知るには isViewLoaded を呼ぶ。

- loadView

Interface Builder 使用時は loadView をオーバーライドしてはならない。

すべきこと:

  • ビューを生成し self.view に代入する。

すべからざること:

  • self.view 以外のプロパティの変更
  • 親クラス (UIViewController 自身) の loadView の呼び出し

- viewDidLoad

loadView が呼ばれた直後に呼ばれる。

すべきこと:

  • 必要に応じて self.view の状態を変更する。

すべからざること:

  • self.view 以外のプロパティの変更

view プロパティは initWith... では初期化されず、初めて view プロパティが参照されるときに初期化される。いつプロパティが参照されるかは不確定なので (特にビューコントローラーを作った後すぐ表示しない場合)、タイミングが重要な処理を loadView/viewDidLoad に書いてはいけない。特に、ビューが表示される直前にナビゲーションバーを隠すとか画面の向きに応じてレイアウトするとかの処理をここに書くのは誤り。

view の子ビューを生成するのは本来は view 自身の仕事だが、カスタムビュークラスを作るのをサボって UIView のインスタンスを view として使う場合は loadView/viewDidLoad から view に子ビューを追加して良い。

表示関連イベント

viewWillAppear: の後 viewDidAppear: が呼ばれるとは必ずしも限らない。同じく、 viewWillDisappear: の後 viewDidDisappear: が呼ばれるとは必ずしも限らない。UIViewController のマニュアルにある状態遷移図を見ること。

- viewWillAppear:

ビューが見え始める時に呼ばれる

- viewDidAppear:

ビューが完全に見える状態になった時に呼ばれる

- viewWillDisappear:

ビューが見えなくなり始める時に呼ばれる

- viewDidDisappear:

ビューが完全に見えなくなった時に呼ばれる

これらのメソッドは、親クラスの同メソッドを呼び出さなければならない。さもないと、子ビューコントローラーの同メソッドが呼ばれなかったりする。

レイアウト

以下のメソッドを必要に応じてちまちま実装するのは面倒なので、自動レイアウトで済むところはなるべくそれに任せた方が良い。

- viewWillLayoutSubviews

self.viewlayoutSubviews が呼ばれる直前に呼ばれる。

すべからざること:

  • self.view (の子ビュー)の frame や bounds を調整する

- viewDidLayoutSubviews

self.viewlayoutSubviews が呼ばれた直後に呼ばれる。 self.view の子ビューのレイアウトを手動調整する必要がある場合は基本的にここでする。

すべからざること:

  • self.view の子ビューの子ビューのレイアウトを調整する。

- viewWillTransitionToSize:withTransitionCoordinator:

ビューのサイズが変化する前に呼ばれる。(iOS 8 以降)

すべきこと:

  • 親クラスの同メソッドの呼び出し

- sizeForChildContentContainer:withParentContainerSize:

子ビューコントローラの適切なサイズを求めるために呼ばれる。(iOS 8 以降)

すべからざること:

  • 状態の変更

- preferredContentSizeDidChangeForChildContentContainer:

子ビューコントローラの推奨サイズが変化したとき呼ばれる。(iOS 8 以降)

- systemLayoutFittingSizeDidChangeForChildContentContainer:

子ビューコントローラのサイズが自動レイアウトによって変化したとき呼ばれる。(iOS 8 以降)

preferredContentSize プロパティ

ビューの推奨サイズを設定する。特に、ビューがポップオーバーで表示されるときのサイズに影響する。

32
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
40