Swift 一个本地通知可以有两个DateComponent吗?
我正在尝试为本地通知设置两个不同的时间-默认时间是每天上午10点(如果用户没有触摸日期选择器来选择自己的通知时间,也就是零),以及基于用户输入的时间。用户输入一个可以工作并每天发送通知,但是如果没有选择时间,则默认时间不工作 这是我的密码,有人能告诉我我做错了什么吗?我基本上想检查,如果用户输入为NIL,它应该恢复到默认的时间设置 在设置中:Swift 一个本地通知可以有两个DateComponent吗?,swift,uilocalnotification,nsdatecomponents,Swift,Uilocalnotification,Nsdatecomponents,我正在尝试为本地通知设置两个不同的时间-默认时间是每天上午10点(如果用户没有触摸日期选择器来选择自己的通知时间,也就是零),以及基于用户输入的时间。用户输入一个可以工作并每天发送通知,但是如果没有选择时间,则默认时间不工作 这是我的密码,有人能告诉我我做错了什么吗?我基本上想检查,如果用户输入为NIL,它应该恢复到默认的时间设置 在设置中: IBOutlet var userDatePicker: UIDatePicker! IBAction func pickerValueChanged(
IBOutlet var userDatePicker: UIDatePicker!
IBAction func pickerValueChanged(_ sender: UIDatePicker) {
var selectedTime = Date()
selectedTime = sender.date
// convert to data type DateComponents
let convertedSelectedTime = calendar.dateComponents([.hour, .minute,], from: selectedTime)
let delegate = UIApplication.shared.delegate as? AppDelegate
delegate?.sendNotification(with: convertedSelectedTime)
UserDefaults.standard.set(selectedTime, forKey: "SavedTime")
}
在AppDelegate中:
func sendNotification(with userSelectedTime: DateComponents?) {
let center = UNUserNotificationCenter.current()
let content = UNMutableNotificationContent()
content.title = "Testing"
content.body = "testing"
var defaultTime = DateComponents()
defaultTime.hour = 10
defaultTime.minute = 00`// trying to set default time to 10 am if user never picks a time`
let components = userSelectedTime ?? defaultTime//option between the two
let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: true)
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
center.add(request)
}
试试这个。它的所有字段都是可选的。所以你可以用你需要的
DateComponents(calendar:timeZone:era:year:month:day:hour:minute:second:nanosecond:weekday:weekdayOrdinal:quarter:weekOfMonth:weekOfYear:yearForWeekOfYear:)
更多信息
更新 在
pickerValueChanged
中,每次更改DatePicker
值时,您都会安排通知。这很糟糕。在那里你应该只存储日期
func pickerValueChanged(_ sender: UIDatePicker) {
UserDefaults.standard.set(sender.date, forKey: "SavedTime")
}
sendNotification
只应发送通知
func sendNotification(with dateComponents: DateComponents) {
let center = UNUserNotificationCenter.current()
let content = UNMutableNotificationContent()
content.title = "Testing"
content.body = "testing"
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
center.add(request)
}
ui应用程序
具有当应用程序转到后台时调用的alife方法。您可以在那里安排通知
func applicationDidEnterBackground(_ application: UIApplication) {
let date = UserDefaults.standard.value(forKey: "SavedTime") as? Date
if let date = date {
let convertedSelectedTime = Calendar.current.dateComponents([.hour, .minute,], from: date)
sendNotification(with: convertedSelectedTime)
} else {
let dateComponent = DateComponents(calendar: Calendar.current,
timeZone: Calendar.current.timeZone,
hour: 10, // Use 22 if PM
minute: 00,
second: 00,
nanosecond: 00)
sendNotification(with: dateComponent)
}
}
如果userdefaults
中存在SavedTime
,请使用它。否则请使用10:00
如果使用SceneDelegate,请使用
sceneDidEnterBackground
而不是applicationidentinterbackground
func sceneDidEnterBackground(_ scene: UIScene) {
}
它们都是生命周期方法 更多信息。
@Willeke谢谢你!谢谢你的邮件!但是,我在哪里可以提供同时接受userSelectedTime的选项?如果用户不选择,默认时间(上午10点)应该是一个后退选项anything@Tine您在哪里使用过userDatePicker?您没有保存按钮吗?它位于设置视图控制器(如上所述)中。然后作为参数传递给AppDelegate中的sendNotification函数。我认为在:let components=userSelectedTime??defaultTime希望如果userSelectedTime不存在,它会选择defaultTime。这显然是有缺陷的,但我不知道该怎么做it@Tina更新了我的答案。哇,谢谢!出于某种原因,它不能与AppDelegate一起工作,但与SceneDelegate一起工作。非常感谢你
func sceneDidEnterBackground(_ scene: UIScene) {
}