首页 > 解决方案 > 从日期选择器保存当前时间以显示本地通知作为提醒

问题描述

在我的应用程序中,我有一个屏幕,其中有一个日期选择器,我已将其日期选择器模式设置为时间。现在,当我导航到此屏幕时,还有一个用于打开和关闭设置每日提醒的开关。现在首先在日期选择器中显示当前时间,然后我们可以通过向上或向下滚动日期选择器来调整时间。假设我没有与 datepicker 交互,只需打开开关并单击保存按钮,我希望保存当前时间,即当我导航到该屏幕时,假设当前时间是晚上 10:00,然后是第二天晚上 10:00 应该显示通知,并且时间应该保存为晚上 10:00,直到或除非我从我的应用程序中注销。表示日期选择器应显示用户保存的时间。我试过但没有运气

每次打开应用程序时日期选择器都会显示当前时间的场景,除非您通过打开开关然后设置不同的时间来设置不同的时间

当我只打开开关时,还没有与日期选择器交互来调整时间。现在,当我单击保存按钮时,当我再次打开应用程序时,它不会保存提醒,它显示的是当前时间,而不是当时设置的时间,即当前时间

当我与 datepicker 交互并调整时间并设置它时,每当我再次打开他的应用程序时它就会工作,然后这次只显示哪个是正确的,并且每天都会在这个时候显示本地通知

我的每日提醒屏幕代码:

class DailyPracticeVC: UIViewController, NavgationTransitionable
{

    @IBOutlet weak var timePicker: UIDatePicker!
    @IBOutlet weak var saveSwitch: UISwitch!

    @IBOutlet var saveBtn: ZFRippleButton!

    var dateTime = Date()
    var formatter : DateFormatter = DateFormatter()

    var isNavigateToSignUpScreen = Bool()
    var isNavigateToCardDeckScreen = Bool()
    var isNavigateToScoreScreen = Bool()

    var c_id = Int()
    var favTag = Int()

    override func viewDidLoad()
    {
        super.viewDidLoad()

        if Defaults[.isSetReminder]
        {
            saveSwitch.isOn = true
        }
        else
        {
            saveSwitch.isOn = false
        }
    }

    override func viewWillAppear(_ animated: Bool)
    {
        super.viewWillAppear(animated)

        if let reminderDate = UserDefaults.standard.object(forKey: "dateTime") as? Date
        {
            dateTime = reminderDate
            timePicker.setDate(reminderDate, animated: true)
        }
        else
        {
            timePicker.setDate(Date(), animated: true)
        }
    }

    @IBAction func selectTime(_ sender: UIDatePicker)
    {
        dateTime = sender.date
        UserDefaults.standard.set(sender.date, forKey: "dateTime")

    }

    @IBAction func switchTapped(_ sender: UISwitch)
    {
        if saveSwitch.isOn
        {
            UNUserNotificationCenter.current().delegate = self
            let center = UNUserNotificationCenter.current()
            center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
                if granted
                {
                    print("User gave permissions for local notification..")
                }
                else
                {
                    print("Permission denied..")
                }
            }
        }
        else
        {
        }
    }

    @IBAction func saveNotification(_ sender: UIButton)
    {
        animateBtn(toBtn: saveBtn) { (isComplete) in
            if isComplete
            {
                if self.saveSwitch.isOn
                {

                    let now = Date()
                    let calendar = Calendar.current
                    var components: DateComponents? = calendar.dateComponents([.hour, .minute], from: now)

                    self.formatter.timeZone = TimeZone.current
                    self.formatter.dateFormat = "HH"
                    let hour = self.formatter.string(from: self.dateTime)
                    self.formatter.dateFormat = "mm"
                    let min = self.formatter.string(from: self.dateTime)
                    print(hour,min)

                    components?.hour = Int(hour)!
                    components?.minute = Int(min)!

                    let current = UNUserNotificationCenter.current()
                    let content = UNMutableNotificationContent()
                    content.title = "Reminder for studying deck cards!!"
                    content.body = "Remember to study your spanish with Flash Spanish! You’ll be a pro in no time! Study Now >"
                    content.sound = .default
                    content.userInfo = ["value": "Data with local notification"]


                    let trigger = UNCalendarNotificationTrigger(dateMatching: components!, repeats: true)
                    let request = UNNotificationRequest(identifier: "reminder", content: content, trigger: trigger)

                    current.add(request){ (error) in
                        if (error != nil)
                        {
                            self.view.makeToast(error?.localizedDescription ?? "error in local notification")
                        }
                    }

                    self.saveBtn.setTitle("Reminder Saved", for: .normal)
                    SVProgressHUD.show(withStatus: "Reminder Saved")

                    Defaults[.isSetReminder] = true

                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                        SVProgressHUD.dismiss()

                        if Defaults[.UserIsLogin]
                        {
//                            self.navigationController?.popViewController(animated: true)
                            let vc = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
                            vc.c_id = self.c_id
                            vc.fav_tag = self.favTag
                            self.navigationController?.pushViewController(vc, animated: true)
                        }
                        else
                        {
                            if self.isNavigateToSignUpScreen == false
                            {
                                self.navigationController?.popViewController(animated: true)
                            }
                            else
                            {
                                let vc = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
                                vc.c_id = self.c_id
                                vc.fav_tag = self.favTag
                                self.navigationController?.pushViewController(vc, animated: true)
                            }
                        }
                    }
                }
                else
                {
                    let current = UNUserNotificationCenter.current()
                    current.removeDeliveredNotifications(withIdentifiers: ["reminder"])
                    current.removePendingNotificationRequests(withIdentifiers: ["reminder"])
                    self.saveBtn.setTitle("Save", for: .normal)
                    SVProgressHUD.show(withStatus: "Reminder Disabled")
                    Defaults[.isSetReminder] = false
                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                        SVProgressHUD.dismiss()

                        if Defaults[.UserIsLogin]
                        {
//                            self.navigationController?.popViewController(animated: true)
                            let vc = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
                            vc.c_id = self.c_id
                            vc.fav_tag = self.favTag
                            self.navigationController?.pushViewController(vc, animated: true)
                        }
                        else
                        {
                            if self.isNavigateToSignUpScreen == false
                            {
                                self.navigationController?.popViewController(animated: true)
                            }
                            else
                            {
                                let vc = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
                                vc.c_id = self.c_id
                                vc.fav_tag = self.favTag
                                self.navigationController?.pushViewController(vc, animated: true)
                            }
                        }
                    }
                }
            }
        }
        playButtonClickAudio()
    }
}

标签: iosdatepickernotifications

解决方案


如果我正确理解您的评论,您希望Date在用户打开开关时将选择器的日期设置为当前日期。您可以在switchTapped已有的方法中执行此操作 - 只需从viewWillAppear那里添加代码:

timePicker.setDate(Date(), animated: true)

编辑:也许你想保存选择器的日期?let now = Date()然后,不要在方法中写入,而是saveNotification获取选择器的日期:let now = timePicker.date


推荐阅读