UIViewControllerのライフサイクルについて
今回はUIViewControllerのライフサイクルについてまとめます。
ViewControllerの遷移時に「どのタイミングで」「どのような処理を行うか」を理解することは、iOSアプリのUI実装において非常に重要です。
本記事では、実務でも特によく使われるメソッドに絞って解説します。
参考文献
簡単にまとめてみた
| メソッド名 | 主な用途 |
|---|---|
| viewDidLoad() | 初期化・UIセットアップ。データの初期表示など。 |
| viewWillAppear(_:) | 表示前の準備。ナビゲーションバーの表示制御など。 |
| viewDidAppear(_:) | アニメーションや非同期処理の開始。 |
| viewWillDisappear(_:) | タイマー停止、編集中の内容の保存。 |
| viewDidDisappear(_:) | リソース解放、監視の停止。 |
1️⃣viewDidLoad
画面の読み込みが完了した際、最初に一度だけ呼ばれるメソッドです。
作成したViewControllerのViewが初めて作られたときに1回だけ呼ばれます。
後述しますがあくまでも一度だけ呼び出しを行いますので、毎回更新したいデータがある場合はviewWillAppearを利用します。
主にラベルやボタンなどの初期化・UIセットアップを行います。
要はラベルやボタンなど、Storyboardで配置しておいた部品はこのタイミングで使える状態になっています。ここでUIの初期設定(文字入れる・色変えるなど、文字の大きさを変える)をしておくのが一般的です。
class SampleViewController: UIViewController {
@IBOutlet weak var textLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// 画面初期化処理を書く
bind()
}
private func bind() {
textLabel.textColor = .red
}
}
実務ではbind()などUI関連のメソッドは別で分けておき、viewDidLoadメソッドの中で呼び出したりします。
2️⃣viewWillAppear
呼び出しを行うViewControllerの画面が表示される直前に呼ばれるメソッドです。
このメソッドを呼び出すタイミングは、まだ画面の表示はされていない状態です。したがって画面の更新したいデータなどがあればそれらの処理を行なったりが可能です。
例えば表示するたびにデータをリフレッシュしたい処理としては「最新のメッセージ」、「スコア」、「バッジ数」、「ポイント」などの更新に適しています。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// 画面表示前の処理を書く
}
viewDidLoadとの違い(1回だけ vs 毎回)
viewDidLoadはViewControllerにセットされているUIのスタイル設定(色、フォント、背景など)、レイアウト設定はviewDidLoadで 最初の1回だけ設定したいもの を行い、viewWillAppearはその後に追加の更新を行うものはviewWillAppearで実行する
3️⃣viewDidAppear
画面の遷移が完全にされた際、呼び出されるメソッドです。
この画面はユーザーが画面を見ている状態を指してますので、このタイミングでViewの生成、UIの初期化を行うことはNGです。
画面が表示されたタイミングで行う処理としてはアニメーションが代表的かと思います。
例えば何かのランクが上がったときに、アニメーションを一度だけ表示するものがあります。画面の表示が終わってからユーザーの視覚的な注目があるタイミングでポップアップ(ダイアログ)などランクアップ演出を行うように設定したりします。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// 画面表示直後の処理を書く
}
viewWillAppearとの違い
viewWillAppearはまだ表示前なので、「演出が被る」「表示が早すぎて見えない」といった不具合の元になります。よってユーザーの視覚的な注目を集めた状態で演出したい場合に用いるのは適しています。
4️⃣viewWillDisappear
Viewが非表示になるタイミングで呼ばれます。
画面はまだ表示されたままの状態で呼ばれます。
例えばアニメーション付きの遷移を行ったりクローズする場合、このアニメーションが開始される前に呼び出します。
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// 画面非表示直前の処理を書く
}
5️⃣viewDidDisappear
Viewが完全に非表示になった直後で呼び出されます。
viewDidDisappearが呼び出しされた際には、既に遷移が完了し、該当の画面は表示されてない状態です。
アニメーションの伴う遷移がある場合は、アニメーションが終了したタイミングで呼び出されます。
注意点⚠️
viewDidDisappearの呼び出しを行う際の注意点として、UIの更新などを行っても既に別の画面を表示していることからユーザー体験として無意味に感じられることがあります。
使用用途としては下記のようなものがあげられます。
- タイマーを止める
- 動画や音楽の再生停止
- カメラセッションの終了
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
// 画面非表示直後の処理を書く
}
まとめ
UIViewController のライフサイクルは、iOSアプリ開発においてUIの表示タイミングや処理の最適化に欠かせない知識です。
この5つをしっかり押さえておくことで、バグのない自然な画面遷移・ユーザー体験を作ることができます。
慣れてきたら、viewWillLayoutSubviews や loadView など他のライフサイクルメソッドも合わせて学んでいくとさらに理解が深まります。