UIViewControllerのライフサイクル

一つのViewControllerが表示される時、実は裏で様々なメソッドが動いています。
それらについて書いていきます。

画面を表示する時

画面を離れる時

画面遷移する際は、以下のような順番で呼ばれます。
画面遷移元:FirstViewController
画面遷移先:SecondViewController

クラス名:FirstViewController メソッド名:viewDidLoad()
クラス名:FirstViewController メソッド名:viewWillAppear
クラス名:FirstViewController メソッド名:viewWillLayoutSubviews()
クラス名:FirstViewController メソッド名:viewDidLayoutSubviews()
クラス名:FirstViewController メソッド名:viewWillLayoutSubviews()
クラス名:FirstViewController メソッド名:viewDidLayoutSubviews()
クラス名:FirstViewController メソッド名:viewDidAppear
画面遷移します ←ここでボタンが押された
クラス名:SecondViewController メソッド名:viewDidLoad()
クラス名:FirstViewController メソッド名:viewWillDisappear
クラス名:SecondViewController メソッド名:viewWillAppear
クラス名:SecondViewController メソッド名:viewWillLayoutSubviews()
クラス名:SecondViewController メソッド名:viewDidLayoutSubviews()
クラス名:FirstViewController メソッド名:viewWillLayoutSubviews()
クラス名:FirstViewController メソッド名:viewDidLayoutSubviews()
クラス名:SecondViewController メソッド名:viewDidAppear
クラス名:FirstViewController メソッド名:viewDidDisappear

注意すべきは、画面遷移の処理が開始した後もFirstViewControllerメソッドが呼ばれているという点です。

サンプルコード

 

それでは具体的にどういうものか一つずつ見ていきましょう。

loadView

基本的にこのメソッドは呼ばないです。
初期化を行いたいなら、むしろviewDidLoadメソッドでやった方がいいでしょう。

原文 和訳

viewDidLoad

自分でviewを作る時、初期化時に追加の修正を入れる時に使います。
まあ、ViewControllerクラスを作成した時にコメントがあるので、その方が役割はわかりやすいです。

// Do any additional setup after loading the view, typically from a nib.
和訳:一般的に、nibからビューをロードした後、追加の設定をする。

原文 和訳

viewWillAppear

このメソッドは画面が表示される直前に呼ばれるメソッドです。
ステータスバーなどの編集をするときはこのメソッド内で行います。
そして、このメソッド内では以下のコードを書いてスーパークラスのviewWillAppearメソッドを呼ぶ必要があります。

super.viewWillAppear(animated)
原文 和訳

viewWillLayoutSubviews

原文 和訳

viewDidLayoutSubviews

原文 和訳

viewDidAppear

このメソッドはビューが表示された後に呼ばれます。
ビューが表示された後なので、ここでレイアウトを編集のは混乱の元になります。

原文 和訳

viewDisappear

画面遷移などで画面が表示されなくなる直前に呼ばれるメソッドです。
UINavigationViewControllerやUITabBarViewControllerなどにViewControllerのオブジェクトが残っている場合は、ViewControllerは破棄されないので気をつけてください。

原文 和訳

viewDidDisappear

画面遷移などで画面が表示されなくなった後に呼ばれるメソッドです。
UINavigationViewControllerやUITabBarViewControllerなどにViewControllerのオブジェクトが残っている場合は、ViewControllerは破棄されないので気をつけてください。

原文 和訳