はじめに
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のライフサイクルイベントまとめ