Swift 一个本地通知可以有两个DateComponent吗?

Swift 一个本地通知可以有两个DateComponent吗?,swift,uilocalnotification,nsdatecomponents,Swift,Uilocalnotification,Nsdatecomponents,我正在尝试为本地通知设置两个不同的时间-默认时间是每天上午10点(如果用户没有触摸日期选择器来选择自己的通知时间,也就是零),以及基于用户输入的时间。用户输入一个可以工作并每天发送通知,但是如果没有选择时间,则默认时间不工作 这是我的密码,有人能告诉我我做错了什么吗?我基本上想检查,如果用户输入为NIL,它应该恢复到默认的时间设置 在设置中: IBOutlet var userDatePicker: UIDatePicker! IBAction func pickerValueChanged(

我正在尝试为本地通知设置两个不同的时间-默认时间是每天上午10点(如果用户没有触摸日期选择器来选择自己的通知时间,也就是零),以及基于用户输入的时间。用户输入一个可以工作并每天发送通知,但是如果没有选择时间,则默认时间不工作

这是我的密码,有人能告诉我我做错了什么吗?我基本上想检查,如果用户输入为NIL,它应该恢复到默认的时间设置

在设置中:

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) {

}