初心者のうちに、とにかくviewDidLoadのところに処理を追加するような例が多いと思いますが、そもそもいったい何なのか?
何か注意しておくことがあるのか?
そういえばちゃんと調べたことがなかった気がします。
viewDidLoadについて
viewDidLoadとは何か?調べてみましょう。
ググっても良いのですが、Appleのdeveloperサイトを参照してみます。
Called after the controller’s view is loaded into memory.
This method is called after the view controller has loaded its view hierarchy into memory. This method is called regardless of whether the view hierarchy was loaded from a nib file or created programmatically in the
Apple Developerサイトより引用loadView()
method. You usually override this method to perform additional initialization on views that were loaded from nib files.
という説明があります。
画面がひとつしかない単純なアプリであれば、ひとまず初期化はここでやっておく、ということを覚えておけば良さそうです。
似たようなものが他にもあります
UIViewControllerには、viewDidLoadと似たようなものがあります。
上記サイトのHandling View-Related Notificationsの図に次のようなものが記載されています。
- viewWillAppear
- viewDidAppear
- viewWillDisappear
- viewDidDisappear
どうやらviewを表示したり消したりする時に呼び出されるようです。
と、いうことで画面遷移をするアプリで試してみましょう。
ひとまず画面1のボタンを押すと画面2に遷移するように、segueでつないだものを用意します。
画面2はpresent modallyで表示します。presentationの部分はautomaticにしてあるので、画面2が表示されても、画面1が少し見えている状態です。
下記のようにデバッグ文を入れて、どんな順番でデバッグ文が表示されるか見てみましょう。
デバッグ文は画面1のfirstの部分を画面2ではsecondにしてあります。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
print("first did load")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("first will appear")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("first did appear")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("first will disappear")
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("first did disappear")
}
}
アプリ起動〜画面1のボタンを押して画面2(automatic)へ遷移
次のような結果でした。
first did load
first will appear
first did appear
second did load
second will appear
second did appear
画面2(automatic)を下にスワイプして表示を消したとき
画面2のwill disappearとdid disappearが呼び出されていますが、画面1関連は特にありませんでした。
second will disappear
second did disappear
再び画面1のボタンを押して画面2(automatic)へ遷移
再び画面2のdid loadが呼び出され、そのあとは同じ流れになっています。
second did load
second will appear
second did appear
アプリ起動〜画面1のボタンを押して画面2(full screen)へ遷移
今度は、画面2をfull screenにして、戻るボタンを追加して試してみます。
戻るボタンは、dismissで画面2を破棄するようにしています。
@IBAction func onBackButton(_ sender: Any) {
dismiss(animated: true, completion: nil)
}
画面2が画面全体に表示されるようになったため、先ほどとは違って、画面1のwill disappearとdid disappearが呼び出されています。
first did load
first will appear
first did appear
second did load
first will disappear
second will appear
second did appear
first did disappear
戻るボタンで画面2(full screen)を破棄して表示を消したとき
画面1は表示されていなかったので、will appearとdid appearが呼び出されていますね。
second will disappear
first will appear
first did appear
second did disappear
再び画面1のボタンを押して画面2(full screen)へ遷移
再び画面2のdid loadが呼び出され、そのあとは同じ流れになっています。
second did load
first will disappear
second will appear
second did appear
first did disappear
結局どんな場合に関係があるの?
例えば、次のような場合があります。
- ある画面に遷移したときだけ、バックライトの設定を変える。
- ある画面で、グラフを表示する。
バックライトの場合は、例えば画面2で特定の設定にしておく必要があると、画面1に遷移する時に元の設定に戻したい、ということがあったりします。
そうすると、画面2のwill appearあたりで元々の設定を保持しておいて、will disappearあたりで元の設定に戻すようなことになります。
また、グラフ表示の場合、例えば画面1で表示していたら画面2に遷移する時に表示を消しておいた方が良かったりします。
画面2から画面1に戻った時に再表示して、元々の表示が残っている場合に重ねて表示されてしまうかもしれません。
viewDidLoadで初期化していると思いますが、上記の例では画面1のviewDidLoadは最初だけしか呼び出されていないため、画面遷移をして戻ってきたときには注意する必要があります。
viewDidLoadで色々と初期化するのは良いけれど・・・
画面遷移をする場合は、willappear、didappear、willdisappear、diddisappearについても理解しておいて、どのタイミングでどれが呼び出されるのか理解して、必要な処理を入れましょう。
コメント