この記事では、UIViewControllerのライフサイクルについて解説していきたいと思います。
Contents
UIViewControllerのライフサイクルとは?
簡単にいうと、画面を表示するときに呼ばれるメソッドの一連の流れのことです。
最初からあるViewDidLoad()は、ライフサイクルの一つです。ViewDidLoad()以外にも、ViewWillAppear()や、viewDidAppear()など、たくさんメソッドがあります。
今回は、それらをわかりやすく綺麗に整理していきたいと思います。
ライフサイクルメソッド
まず、ライフサイクルを呼び出すには、UIViewControllerを継承する必要があります。
class ViewController: UIViewController {
: UIViewControllerがないと使えません。消してみるとわかりますが、ViewDidLoadがエラーになるかと思います。
ライフサイクルメソッドは、たくさんありますが、今回は、5つの基本的なメソッドを解説していきます。
以下は、基本的な5つのメソッドです。
- viewDidLoad() → Viewが読み込まれた時
- viewWillAppear() → Viewが表示される直前
- viewDidAppear() → Viewが表示された時
- viewWillDisappear() → Viewが非表示になる直前
- viewDidDisappear() → Viewが非表示になった時
全体の流れ
まずは全体の流れを掴みましょう。

A画面とB画面、2つの画面があって、A画面には遷移ボタンがあり、B画面には戻るボタンがあります。
以下の図は、画面Aを表示し、画面Bに遷移し、画面Aに戻ったときの画面Aライフサイクルの図です。

では一つ一つみていきましょう。
①viewDidLoad() → Viewが読み込まれた時
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad()")
}
UIViewControllerをデフォルトで作られるメソッドで、Viewが読み込まれた時に1回だけ呼ばれます。

Viewって何なのかというと、Storyboardの最初かあるこのViewのことです。
画面の初期表示の操作は、大体ここで行います。
②viewWillAppear() → Viewが表示される直前
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("viewWillAppear()")
}
Viewが表示される直前に呼ばれます。こちらは、ViewDidLoad()とは違い毎回呼ばれるので、画面遷移で戻ってきた時にも呼ばれます。TabBarの切り替え時でも呼ばれます。
他の画面でなんらかの値を設定して戻ってきたときに、その設定した値を更新して表示するときによく使います。
③viewDidAppear() → Viewが表示された時
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("viewDidAppear")
}
Viewが完全に表示されたときに呼ばれます。こちらも、②と同じく毎回呼ばれます。
ここで注意して欲しいのが、画面が完全に表示された後に呼ばれるので、ここでViewのボタンとかの高さや幅をいじると、一瞬いじられる前も表示されるので、ちょっと不自然な感じになってしまいます。
画面が表示されてから、アニメーションでちょっと動かす時とか、動画の再生、内部へのデータの書き込みなどを行います。
④viewWillDisappear() → Viewが非表示になる直前
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("viewWillDisappear()")
}
何かの値の変更のコミットなどに使われます。
⑤viewDidDisappear() → Viewが非表示になった時
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("viewDidDisappear()")
}
Viewが完全に非表示になったときに呼ばれます。要は遷移した直後に呼ばれるということになります。
なんらかの解除などに使われるらしいです、、、
その他
画面が読み込まれるときに呼ばれるloadView()や、レイアウトが変更される直前に毎回呼ばれるviewWillLayoutSubviews()、レイアウトが変更された後に毎回呼ばれるviewDidLayoutSubviews()などありますが、それほど使用頻度がないので、今回、解説は省略しました。
最後に
適切なタイミングに処理を行わなければ、バグが発生してしまうので、ライフサイクルを意識してプログラムを組んでいきましょう。
参考文献

