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