ViewControllerのライフサイクル
本記事では、UIViewControllerのライフサイクルメソッドと、オーバーライド時にどのような処理を行うべきかをまとめています。
loadView()
viewを生成するメソッドです。ライフサイクルの中で一度だけ呼ばれます。IBでViewControllerを生成している場合には、このメソッドをオーバーライドしてはいけません。通常、以下のような処理を行います
- superviewにカスタムviewを割り当てる
superviewにカスタムviewを割り当てる場合、super.loadView()
は呼びません。また、loadViewをオーバーライドしてコードからviewを生成する際には、初期化処理を分ける必要がないため、viewDidLoadをオーバーライドしない方が良いです。
viewDidLoad()
viewがメモリに読み込まれた後に呼ばれるメソッドです。ライフサイクルの中で一度だけ呼ばれます。通常、viewDidLoadでは以下のような処理を行います。
- viewに対する追加の初期化処理
- ネットワーク通信
- 一度だけ行う処理
このメソッドはboundsが確定する前に呼ばるため、viewのサイズに関連した処理を行うことは避けた方が良いです。
viewWillAppear(_:)
viewがviewヒエラルキーに追加される直前に呼ばれるメソッドです。遷移して画面が表示されようとする度に呼ばれます。上に乗っている画面が取り除かれた(Modalを閉じる、Navigation Barで戻る)場合やTab Barによる切り替え時にも呼ばれます。一方で、ホーム画面から復帰したりコントロールセンターを閉じたりした時には呼ばれません。このメソッドでは通常、以下のような処理を行います。
- UIを非表示や非活性にする処理
- アプリの状態に応じたviewの更新
viewDidAppear(_:)
viewが画面に表示された際に呼ばれるメソッドです。通常以下のような処理を行います。
- CoreDataへのデータ書き込み
- アニメーションや動画の再生
viewWillLayoutSubviews(_:)
superviewのboundsが変更される直前に呼ばれるメソッドです。superviewにaddSubviewされたり、デバイスの向きが変わったりする度に呼ばれます。デフォルトでは何の処理も行われません。
viewDidLayoutSubviews(_:)
subviewのレイアウトが完了した際に呼ばれるメソッドです。AutoLayoutを用いている場合、viewのboundsはここで確定されます。こちらもデフォルトでは何の処理も行われません。以下のような処理を行います。
- viewのサイズを用いた処理
viewWillDisappear(_:)
viewがviewヒエラルキーから取り除かれる直前に呼ばれるメソッドです。Modal, Navigation Barによる遷移、Tab Barによる切り替え時に呼ばれます。通常以下のような処理を行います。
- ViewControllerでの変更の保存
viewDidDisappear(_:)
viewがviewヒエラルキーから取り除かれた後に呼ばれるメソッドです。通知の解除を行うこともありますが、iOS 9以降は自動的に解除されるので記述することはあまりありません。
loadView()
とviewDidLoad()
以外のメソッドはライフサイクルの中で複数回呼ばれるため、viewの追加や重たい処理などには注意する必要があります(removeを呼んだりフラグを立てたりするなど)。
参考文献