重新运行 app后在UIDatePicker中显示保存的时间

Display saved time in UIDatePicker after re-run app

我可以通过UIDatePicker设置通知的时间。但是如果我关闭应用程序并再次 运行 ,那么时间将重置为当前时间。尽管通知本身会在先前规定的时间内出现。如何在我之前保存的 UIDatePicker(timeDatePicker 和 timeDatePickerSecond)中显示时间(点击 Schedule 后)?

import UIKit
import UserNotifications

class Notifications: UIViewController, UNUserNotificationCenterDelegate {

    @IBOutlet weak var scheludeMeal: UIButton!
    @IBOutlet weak var timeDatePicker: UIDatePicker!
    @IBOutlet weak var timeDatePickerSecond: UIDatePicker!


    override func viewDidLoad() {
        super.viewDidLoad()

        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
            if granted {
                print("Yes!")
            } else {
                print("No...?")
            }
        }

    }


    @IBAction func scheludeButton(_ sender: Any) {

        let center = UNUserNotificationCenter.current()

        center.removeAllPendingNotificationRequests()

        let content = UNMutableNotificationContent()
        content.title = "Notification!"
        content.body = "Description of notification :)"
        content.sound = UNNotificationSound.default

        let dateComponent = timeDatePicker.calendar.dateComponents([.hour, .minute], from: timeDatePicker.date)
        let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponent, repeats: true)
        let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
        center.add(request)

        let dateComponentSd = timeDatePickerSecond.calendar.dateComponents([.hour, .minute], from: timeDatePickerSecond.date)
        let trigger2 = UNCalendarNotificationTrigger(dateMatching: dateComponentSd, repeats: true)
        let request2 = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger2)
        center.add(request2)

    }

}

您可以使用 UserDefaults 在应用程序启动之间保留 Date 对象。您只需要确保将新选择的 Date 对象保存在 scheduleButton 中,并将 UserDefaults 中的值加载到 viewDidLoad 中以设置为默认日期选择器。

您可以找到针对 timeDatePicker 实施的所述解决方案,但如果您还需要针对 timeDatePickerSecond 实施的解决方案,只需为此创建另一个 Date? 属性 并实施它同样,但请确保在第二个 属性.

中使用不同的 UserDefaults
import UIKit
import UserNotifications

class Notifications: UIViewController, UNUserNotificationCenterDelegate {

    @IBOutlet weak var scheludeMeal: UIButton!
    @IBOutlet weak var timeDatePicker: UIDatePicker!
    @IBOutlet weak var timeDatePickerSecond: UIDatePicker!

    var savedNotificationDate: Date? {
        get {
            return UserDefaults.standard.object(forKey: "notificationDate") as? Date
        }
        set {
            UserDefaults.standard.set(newValue, forKey: "notificationDate")
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        if let savedNotificationDate = savedNotificationDate {
            timeDatePicker.date = savedNotificationDate
        }

        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
            if granted {
                print("Yes!")
            } else {
                print("No...?")
            }
        }

    }


    @IBAction func scheludeButton(_ sender: Any) {

        let center = UNUserNotificationCenter.current()

        center.removeAllPendingNotificationRequests()

        let content = UNMutableNotificationContent()
        content.title = "Notification!"
        content.body = "Description of notification :)"
        content.sound = UNNotificationSound.default

        let dateComponent = timeDatePicker.calendar.dateComponents([.hour, .minute], from: timeDatePicker.date)
        let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponent, repeats: true)
        let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
        center.add(request)
        savedNotificationDate = timeDatePicker.date

        let dateComponentSd = timeDatePickerSecond.calendar.dateComponents([.hour, .minute], from: timeDatePickerSecond.date)
        let trigger2 = UNCalendarNotificationTrigger(dateMatching: dateComponentSd, repeats: true)
        let request2 = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger2)
        center.add(request2)

    }

}