この記事では、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()
などありますが、それほど使用頻度がないので、今回、解説は省略しました。
最後に
適切なタイミングに処理を行わなければ、バグが発生してしまうので、ライフサイクルを意識してプログラムを組んでいきましょう。
参考文献