【问题标题】:save current time from date picker for show showing local notifications as a reminder从日期选择器保存当前时间以显示本地通知作为提醒
【发布时间】:2019-12-05 17:54:20
【问题描述】:

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

scenario when the date picker will be showing current time everytime when you open the app unless you set the differen time by turning the switch on and then setting different time

scenario when i have only turn on the switch, have not yet interact with the datepicker to adjust time. now when i click save button reminder is not being saved when i again open the app it shows the current time, not the time that was set which is at that time the current time

scenario when i have interact with datepicker and adjust the time and set it, it is working whenever i again opent he app then this time only shows which is correct and everyday at this time the local notification will be shown

我的每日提醒屏幕代码:

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()
    }
}

【问题讨论】:

  • 您设置选择器时间的方式timePicker.setDate(Date(), animated: true) 对我来说是正确的。究竟是什么问题?选择器的日期是哪一天?
  • 假设我第一次打开应用程序,然后导航到提醒屏幕,然后开关将关闭,日期选择器将显示当前时间,除非我们自己设置其他时间。但是我想要的是,当我刚刚打开开关并直接单击保存按钮时,应该保存当前时间@phi

标签: ios datepicker notifications


【解决方案1】:

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

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

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

【讨论】:

  • 不,不是这样,无论我打开还是关闭开关都会显示当前时间,关闭开关是用于您是否要设置提醒的开启或关闭。但是每当我想设置时间时,必须打开开关,然后才能设置时间。我想说的是,如果我打开开关并且没有与 datepicker 交互,那么当单击保存按钮时,当前时间也应该被保存,就像它在我设置时保存的其他时间一样。例如,当前时间是晚上 10:00,我已将时间设置为晚上 9 点,然后正在保存 9 点
  • 如何将视频上传到 SO 以便您正确理解
  • 您还不能上传视频,但如果有帮助,请查看我的编辑。
  • 不工作,当我点击保存时时间是上午 12:43,当我回来时它显示上午 12:45
  • 简而言之,如果我与 datepicker 交互,它还应该保存当前时间,因为它会保存其他时间。如果您可能清楚,请查看屏幕截图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 2019-08-22
相关资源
最近更新 更多