ViewControllerのライフサイクル

Satsuki Hashiba
4 min readFeb 26, 2020

--

本記事では、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を呼んだりフラグを立てたりするなど)。

参考文献

--

--