「日付が変わったことをアプリに反映させたい!」という場合ですが、
アプリをいったん閉じて、また起動させた時には反映させることはできそうです。
ですがアプリを起動させたまま、他のアプリを使っていて日付が変わって、また起動させたままのアプリに戻ってきた場合はどうしたら良いのか?
起動時に更新するようにしていてもダメそうです。かといってタイマーで定期的に日付が変わったかどうかチェックするのはイマイチです。
そこで別の方法を試してみましたので参考になればと思います。
日付が変わったことを反映させる方法
次のような方法にしました。
- AppDelegate.swiftにapplicationSignificantTimeChangeを追加する
- NotificationCenterでViewControllerに通知する
Extension.swiftのファイルを追加してNotificationNameを記入
extension Notification.Name {
static let dayChanged = Notification.Name("dayChanged")
}
AppDelegate.swiftにapplicationSignificantTimeChangeを追加
func applicationSignificantTimeChange(_ application: UIApplication) {
NotificationCenter.default.post(name: .dayChanged, object: nil)
}
ViewControllerにNotificationCenter.default.addObserverを追加
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var dayLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
print("view didloaded")
setDate()
NotificationCenter.default.addObserver(self, selector: #selector(dayChangeOccured), name: .dayChanged, object: nil)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("view will appear")
}
@objc func dayChangeOccured() {
setDate()
}
func setDate() {
let formatter = DateFormatter()
formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "yddMMMEEE", options: 0, locale: Locale.current)
dayLabel.text = formatter.string(from: Date())
}
}
内容について
1画面だけのアプリで、画面には日付を表示するラベル(@IBOutlet weak var dayLabel: UILabel!)があります。
func setDate()でこのラベルに日付をセットするようにしています。
AppDelegate.swiftに追加したfunc applicationSignificantTimeChange(_ application: UIApplication)は、日付が変わったときに呼ばれます。
ですので、ここにNotificationCenter.default.postで通知をセットしておきます。
これをViewControllerで受け取れるようにNotificationCenter.default.addObserverをセットしておけばOKです。
試してみましょう
アプリを起動して、他のアプリを使いながら日付が変わるのを待ってみましょう。
日付が変わったら、このアプリに戻ってみましょう。
無事に日付が変わると思います。
また、ついでになりますがview didloadedやview will appearは最初の起動時にしか通っていないことがわかると思います。
ですので、アプリが起動したままの場合には、この部分(view didloaded、view will appear)で日付を更新することはできないことがわかります。
ということで、使い所は限られているかもしれませんが、地味に役に立つかもしれません。
コメント