Navigation Controllerで前の画面に戻った時、viewDidLoadに実装している処理が実行されない、といったことを経験したことはありませんか?
この記事では、そんな疑問をお持ちの方へ、Navigation Controllerで前の画面に戻ったタイミングで、何か処理をする方法をご紹介します。
なお、この記事では、以下の記事で作成したツールを使用しますが、以下の記事を読んでいなくても、プログラムの内容は理解できますので、ご安心ください。
この記事では、以下のツールを作成する方法を、ソースコード付きで解説しています。
Navigation Controllerで前の画面に戻ったタイミングで処理をする方法
こちらの記事では、以下のように、表示ボタンを押したら、2画面目に入力したテキストを表示するツールを作りました。
今回は、このツールを改良し、2画面目から戻ってきたタイミングで、入力したテキストを、自動的にラベルに表示させるようにしてみましょう。
以下の流れで、ツールの作り方をご紹介します。
- プログラムを作ってみる
- プログラムの処理を考えてみる
プログラムを作ってみる
早速プログラムを作って、動作確認もしてみましょう。
1画面目用のViewControllerプログラムに、処理を追記します。
ハイライトの箇所が、追記したプログラムです。
import UIKit
class ViewController: UIViewController {
// テキストを表示するラベル
@IBOutlet var label: UILabel!
// 次の画面で入力されたテキスト
var text:String = "Label"
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func viewWillAppear(_ animated: Bool) {
label.text = text
}
@IBAction func tapButton(sender: UIButton) {
label.text = text
}
}
シミュレータを起動して、動作確認をしてみましょう。
以下のように、Backボタンを押して、戻ったタイミングで、自動的にラベルのテキストが更新されていることを確認できましたね。
プログラムの処理を考えてみる
プログラムが何をしているのか、考えてみましょう。
今回、画面が表示されたタイミングに実施したい処理 (ラベルへのテキスト表示) は、viewWillAppearというメソッドに書きました。
同じように、画面が表示されたタイミングで実施したい処理を各場所として、viewDidLoadもありますよね。
両者の違い以下の通りになります。
メソッド | |
---|---|
viewDidLoad | Viewが初めて表示される (メモリに取り込まれる) 時に、呼び出される。 |
viewWillAppear | Viewが表示される時に、呼び出される。 |
これで分かりましたね。つまり、viewDidLoadは初めてViewが表示されるタイミングでしか呼ばれないため、次の画面から戻ったタイミングでは実行されないのです。
初回に限らず、そのViewが表示されたタイミングで、必ず実行したい処理がある場合は、viewWillAppearの使用なども検討してみましょう。