ios - 从日期选择器保存当前时间以显示本地通知作为提醒
问题描述
在我的应用程序中,我有一个屏幕,其中有一个日期选择器,我已将其日期选择器模式设置为时间。现在,当我导航到此屏幕时,还有一个用于打开和关闭设置每日提醒的开关。现在首先在日期选择器中显示当前时间,然后我们可以通过向上或向下滚动日期选择器来调整时间。假设我没有与 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()
}
}
解决方案
如果我正确理解您的评论,您希望Date
在用户打开开关时将选择器的日期设置为当前日期。您可以在switchTapped
已有的方法中执行此操作 - 只需从viewWillAppear
那里添加代码:
timePicker.setDate(Date(), animated: true)
编辑:也许你想保存选择器的日期?let now = Date()
然后,不要在方法中写入,而是saveNotification
获取选择器的日期:let now = timePicker.date
。
推荐阅读
- python - Leetcode Add twosum the ListNode' is not defined 错误
- android - 在recyclerview中滚动到顶部加载更多数据
- azure - Azure EventGrid 是否已定义出站 IP 地址
- sql - 来自多列的 Laravel 元素计数
- node-red - Nodered httpauth 节点 文件类型凭证
- python - 使用 timedelta 将一个月添加到 datetime64
- redis - 如何删除 Redis 流?
- javascript - 如何获取 id 值并将其添加为祖父母作为属性
- javascript - Angular Material 对话框:为什么让它如此复杂?
- python - Python 3 中的 ModuleNotFoundError 但 Python 2 中没有