はじめに
viewWillAppear
で日付を取得し、ラベルに表示させていました。アプリをキルしない状態で日付を跨ぐと画面の切り替え等を行わない限り、viewWillAppear
は呼ばれないためUIが更新されない問題が発生しました。
viewController
のライフサイクルにはフォアグラウンドやバックグラウンドになる時に呼ばれるものは存在しないため、別の角度からUIを更新できるようにします。
※間違った認識等あれば、ご指摘いただけると幸いです。
解決策
アプリをキルしないユーザーは一定数存在しているため、解決策としてNotificationCenter
を使い、フォアグラウンドに入った時を検知して特定のUIを更新する処理を実装する。
ほぼ同じ処理なので、バックグラウンドになった時も合わせて記載しています。
※NotificationCenter
がよく分からない人は使用頻度が高いので調べてみるといいと思います。
フォアグラウンド、バックグラウンドに入った時に通知を受け取る
NotificationCenter
でフォアグラウンド、バックグラウンドになったのを以下で検知します。
フォアグラウンド:UIApplication.willEnterForegroundNotification
バックグラウンド:UIApplication.didEnterBackgroundNotification
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// アプリがフォアグラウンドに入った時に呼ばれる
NotificationCenter.default.addObserver(
self,
selector: #selector(viewWillEnterForeground(_:)),
name: UIApplication.willEnterForegroundNotification,
object: nil
)
// アプリがバックグラウンドに入った時に呼ばれる
NotificationCenter.default.addObserver(
self,
selector: #selector(viewDidEnterBackground(_:)),
name: UIApplication.didEnterBackgroundNotification,
object: nil
)
}
}
実行したい処理
以下の関数を定義して、実行したい処理を記載していきます。
@objc func viewWillEnterForeground(_ notification: Notification?) {
if (self.isViewLoaded && (self.view.window != nil)) {
// 実行したい処理を記載(例:日付ラベルの更新)
}
}
@objc func viewDidEnterBackground(_ notification: Notification?) {
if (self.isViewLoaded && (self.view.window != nil)) {
// 実行したい処理を記載
}
}
他にもUIApplication
でアプリの状態を検知できるメソッドがあるので、Apple公式の以下をご参考ください。
参考