主に Interface Builder を使用せずガリガリコーディングする人向け。基本的には UIViewController のマニュアルを読めって感じなのだが...
ビューコントローラーの初期化
- initWithNibName:bundle:
すべきこと:
- 必要な全プロパティの初期化 (
view
プロパティを除く)
すべからざること:
-
view
プロパティの初期化
ビュー
view
プロパティ
このプロパティのゲッターは普通のゲッターではない。view
が未初期化の時にゲッターを呼ぶと、中で loadView
と viewDidLoad
が呼ばれ、結果のビューが返される。
ビューが初期化済みかどうか知るには 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.view
の layoutSubviews
が呼ばれる直前に呼ばれる。
すべからざること:
-
self.view
(の子ビュー)の frame や bounds を調整する
- viewDidLayoutSubviews
self.view
の layoutSubviews
が呼ばれた直後に呼ばれる。 self.view
の子ビューのレイアウトを手動調整する必要がある場合は基本的にここでする。
すべからざること:
-
self.view
の子ビューの子ビューのレイアウトを調整する。
- viewWillTransitionToSize:withTransitionCoordinator:
ビューのサイズが変化する前に呼ばれる。(iOS 8 以降)
すべきこと:
- 親クラスの同メソッドの呼び出し
- sizeForChildContentContainer:withParentContainerSize:
子ビューコントローラの適切なサイズを求めるために呼ばれる。(iOS 8 以降)
すべからざること:
- 状態の変更
- preferredContentSizeDidChangeForChildContentContainer:
子ビューコントローラの推奨サイズが変化したとき呼ばれる。(iOS 8 以降)
- systemLayoutFittingSizeDidChangeForChildContentContainer:
子ビューコントローラのサイズが自動レイアウトによって変化したとき呼ばれる。(iOS 8 以降)
preferredContentSize
プロパティ
ビューの推奨サイズを設定する。特に、ビューがポップオーバーで表示されるときのサイズに影響する。