はじめに
iOS開発を始めてすぐに出会う、これ。
override func viewDidLoad() {
super.viewDidLoad()
}
最初から書いてありますが、これはなんなのか。
そして、iOS開発をある程度進めてみると、viewWillAppear()
ってのも出てきます。これも一体なんなんだ。
これらを理解するためには、ライフサイクルというものを知らなくてはなりません。
ライフサイクルとは
さきほどのviewDidLoad()
は、画面の読み込みが終了した時に呼び出されるメソッドです。
当たり前ですが、画面それぞれに「画面の読み込み」や「画面の表示」、「画面の破棄」などが存在します。
これら、画面の表示から破棄までの一連の状態変化のことをライフサイクルといいます。文字通り画面の一生というわけです。
また、画面にライフサイクルがあるならアプリ自体にもライフサイクルがありますが、本記事では割愛します。AppDelegate
などについて調べてみると、分かってくることがあるかと思います。
画面のライフサイクル一覧
さて、画面のライフサイクルを列挙してみましょう。
1. loadView
2. viewDidLoad
3. viewWillAppear
4. updateViewConstraints
5. viewWillLayout
6. viewDidLayout
7. viewDidAppear
8. viewWillDisappear
9. viewDidDisappear
ひとつずつ見ていきましょう。
1. loadView
最初に画面を読み込む際の処理がここになります。このとき、view自体の大きさなども決まる上、関連付けされたUIパーツなども読み込まれていきます。
super.loadView()
が終わった後ならviewの背景色などのプロパティを変更できるということになりますね。
ここで、overrideするときにsuper.loadView()
をしないと画面が真っ黒になります。(overrideしているので当たり前ですが。)気をつけましょう!
2. viewDidLoad
最初から記入されている子ですよね。画面の読み込みが終わった時の処理がここで書かれます。前述の通り、画面の背景色だったり、関連付けされたUIパーツを角丸にしたりなどの処理がここで行えます。
ちなみに、今後のライフサイクルにおいてもですが、自分でコードを書く際にはoverrideをすることになります。loadViewだけは特別ですが、それ以外は処理が始まる前後に呼び出される子たちなので例えばsuper.viewDidLoad()
と書かなくても基本的にバグは起こりません。しかし、一定数のライブラリ(僕の経験上ではEureka)では、これを行わないとバグるものが存在しますので、書いておくことをおすすめします。
3. viewWillAppear
画面が表示される直前に呼び出されます。viewDidAppear()
の次によく使う印象ですが、画面が表示される前に呼び出されるので、遷移先の画面から戻ってくる時にも呼び出されます。例えば表示するデータの取得などをここでするといいでしょう。
4. updateViewConstraints
AutoLayoutがあれば、それを実行します。これもoverrideするならsuper.updateViewConstraints()
をしてあげないと怒られます。
5. viewWillLayout & 6. viewDidLayout
UIViewはlayoutSubViews()
というメソッドを持つのですが、これの実行前と実行後に呼び出されます。
7. viewDidAppear
画面が表示された直後に呼び出されます。画面のアニメーションやアラートなどをここで呼び出すといい感じでしょう。
8. viewWillDisappear & 9. viewDidDisappear
もうわかると思いますが、画面が遷移する直前と完全に遷移した直後によびだされます。僕はよくtimerのinvalidateを(念の為)ここで行います。
注意点として、segueがPresent ModallyでpresentationがSame As Destinationなどの時、要するに遷移元の画面が裏にちょっとだけ見えるような遷移の場合、これらは呼び出されません。呼び出したければPresentationをFull Screenにするなどすればいいでしょう。
まとめ
たまにライフサイクルを理解していないために起こしてしまうバグが存在しますので、どのタイミングでなにを使っていいのかをしっかりと確認しておきましょう。