LoginSignup
3
4

More than 3 years have passed since last update.

ViewControllerのライフサイクルについて

Last updated at Posted at 2021-04-12

はじめに

ViewControllerのライフサイクルとオーバーライド時の適切な処理を備忘録として書きます。

ViewControllerのライフサイクル

以下のようになっており、上から順に呼ばれます。

 func loadView()

 func viewDidLoad()

 func viewWillApper(_:)

 func viewWillLayoutSubviews(_:)

 func viewDidLayoutSubviews(_:)

 func viewDidAppear(_:)

 func viewWillDisappear(_:)

 func viewDidDisappear(_:)

①loadView()

viewを生成するメソッドであり、1度だけ呼ばれます。

Storyboardやxibなど、InterfaceBuilderを使用している場合は
このメソッドをオーバライドしてはいけません

loadView() | Apple Developer Documentation

・適切な処理

コードでviewを作成する場合などに適しています。
その際には、super.loadView()は呼びません。

②viewDidLoad()

viewがメモリに読み込まれた後1度だけ呼ばれます。

viewDidLoad() | Apple Developer Documentation

・適切な処理

viewに対する追加の初期化処理ネットワーク通信など1度だけ行う何らかの処理などが適しています。

基本的な初期化の処理は大体ここで行いますが、このタイミングではviewのframeが確定されていないので正確なframeを取得することが出来ません

viewDidLayoutSubviews(_:)以降にviewのサイズに関連した処理を書く必要があります。

③viewWillAppear(_:)

viewが画面に表示される直前に呼ばれます。

loadView()viewDidLoad()と違って
遷移やTab Bar切り替え時など画面が表示されようとする度に呼び出されます。

一方でホーム画面からの復帰や、コントロールセンターを閉じたりした時には呼ばれません。

viewWillAppear(_:) | Apple Developer Documentation

・適切な処理

viewが画面に表示される前に実行する必要のある処理
画面を表示するたびにviewを更新したい場合などに適しています。

④viewWillLayoutSubviews(_:)

viewがSubviewをレイアウトする前に呼ばれます。

デフォルト実装では何もしません

viewWillLayoutSubviews(_:) | Apple Developer Documentation

⑤viewDidLayoutSubviews(_:)

viewがSubviewをレイアウトした後に呼ばれ、デフォルト実装では何もしません

viewDidLoad()の部分で書いたように
これ以降のタイミングではないと正確なframeは取得できません

viewDidLayoutSubviews(_:) | Apple Developer Documentation

・適切な処理

viewのサイズに関係する処理などが適しています。

⑥viewDidApper(_:)

viewが画面に表示された後に呼ばれます。

このメソッドが呼ばれたタイミングでは、すでにviewが描画されている状態なので
ここでviewの生成を行えば、おかしな事になったりするので注意が必要です。

viewDidAppear(_:) | Apple Developer Documentation

・適切な処理

アニメーション開始、動画の再生データのフェッチなど
viewが画面に表示された後、すぐに必要となる処理を行うのに適しています。

⑦viewWillDisappear(_:)

viewが表示されなくなる直前に呼ばれます。

具体的には、画面遷移Tab Barによる切り替え時に呼ばれます。

viewWillDisappear(_:) | Apple Developer Documentation

⑧viewDidDisappear(_:)

遷移などでviewが完全に表示されなくなった時に呼ばれます。

viewDidDisappear(_:) | Apple Developer Documentation

・適切な処理

何らかの終了処理などをここで行うのに適しています。

おわりに

loadView()viewDidLoad()以外のメソッドはライフサイクルの中で複数回呼ばれるので、viewの追加や重い処理などには注意が必要です。

間違っていればコメントして下さると有り難いです!

参考資料

ViewControllerのライフサイクル
iOS開発におけるUIViewControllerのライフサイクルイベントまとめ

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4