【Xcode/Swift】Swiftのライフサイクルについて解説(ViewDidLoad, ViewWillAppear, viewDidAppearなど)

この記事では、UIViewControllerのライフサイクルについて解説していきたいと思います。

UIViewControllerのライフサイクルとは?

簡単にいうと、画面を表示するときに呼ばれるメソッドの一連の流れのことです。

最初からあるViewDidLoad()は、ライフサイクルの一つです。ViewDidLoad()以外にも、ViewWillAppear()や、viewDidAppear()など、たくさんメソッドがあります。

今回は、それらをわかりやすく綺麗に整理していきたいと思います。

ライフサイクルメソッド

まず、ライフサイクルを呼び出すには、UIViewControllerを継承する必要があります。

class ViewController: UIViewController {

: UIViewControllerがないと使えません。消してみるとわかりますが、ViewDidLoadがエラーになるかと思います。

ライフサイクルメソッドは、たくさんありますが、今回は、5つの基本的なメソッドを解説していきます。

以下は、基本的な5つのメソッドです。

  • viewDidLoad()
  • viewWillAppear()
  • viewDidAppear()
  • viewWillDisappear()
  • viewDidDisappear()

全体の流れ

まずは全体の流れを掴みましょう。

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()")
}

Disappearディサピアーというのを直訳すると、「消える」です。ですので、Viewが非表示になる直前に呼ばれます。要は他の画面に遷移する直前に呼ばれるということになります。

何かの値の変更のコミットなどに使われます。

⑤viewDidDisappear() → Viewが非表示になった時

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    print("viewDidDisappear()")
}

Viewが完全に非表示になったときに呼ばれます。要は遷移した直後に呼ばれるということになります。

なんらかの解除などに使われるらしいです、、、

その他

画面が読み込まれるときに呼ばれるloadView()や、レイアウトが変更される直前に毎回呼ばれるviewWillLayoutSubviews()、レイアウトが変更された後に毎回呼ばれるviewDidLayoutSubviews()などありますが、それほど使用頻度がないので、今回、解説は省略しました。

最後に

適切なタイミングに処理を行わなければ、バグが発生してしまうので、ライフサイクルを意識してプログラムを組んでいきましょう。