如何在 Swift 的日期选择器上设置本地通知时间

Posted

技术标签:

【中文标题】如何在 Swift 的日期选择器上设置本地通知时间【英文标题】:How to set local notification time to time on date picker for Swift 【发布时间】:2017-08-10 02:22:25 【问题描述】:
import UIKit
import UserNotifications


class ViewController: UIViewController 

    @IBOutlet weak var myDatePicker1: UIDatePicker!
    @IBAction func action(_ sender: Any) 
        let content = UNMutableNotificationContent()
        content.title = "This is a notification"
        content.subtitle = "I hope this works"
        content.body = "from the tutorial"
        content.badge = 1

        let componentsFromDate = Calendar.current.dateComponents(in: TimeZone.current, from: myDatePicker1.date)

        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: componentsFromDate, repeats: true)

        let request = UNNotificationRequest(identifier: "timeDone", content: content, trigger: trigger)
        UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)

    


    override func viewDidLoad() 
        super.viewDidLoad()
         UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: didAllow, error in)
        // Do any additional setup after loading the view, typically from a nib.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


这是我打印请求和触发器时控制台中显示的内容:

<UNNotificationRequest: 0x6000002335e0; identifier: timeDone, content:
 <UNNotificationContent: 0x600000113ef0; title: This is a notification,
 subtitle: I hope this works, body: from the tutorial,
 categoryIdentifier: , launchImageName: , peopleIdentifiers: ( ),
 threadIdentifier: , attachments: ( ), badge: 1, sound: (null),
 hasDefaultAction: YES, defaultActionTitle: (null),
 shouldAddToNotificationsList: YES,
 shouldAlwaysAlertWhileAppIsForeground: NO, shouldLockDevice: NO,
 shouldPauseMedia: NO, isSnoozeable: NO, fromSnooze: NO,
 darwinNotificationName: (null), darwinSnoozedNotificationName: (null),
 trigger: <UNCalendarNotificationTrigger: 0x600000233540;
 dateComponents: <NSDateComponents: 0x6000003461a0>
     Calendar: <CFCalendar 0x60000009c7a0 [0x10c9fee40]>identifier = 'gregorian'
     TimeZone: America/Vancouver (PDT) offset -25200 (Daylight)
     Era: 1
     Calendar Year: 2017
     Month: 8
     Leap month: no
     Day: 11
     Hour: 9
     Minute: 58
     Second: 39
     Nanosecond: 0
     Quarter: 0
     Year for Week of Year: 2017
     Week of Year: 32
     Week of Month: 2
     Weekday: 6
     Weekday Ordinal: 2, repeats: YES>>

我是使用 Swift 开发应用程序的新手,我正在尝试创建一个简单的应用程序,当用户在日期选择器上选择时,它会向用户发送本地通知。出于某种原因,UNCalenderNotificationTrigger 只会采用DateComponents(),而DateComponents() 必须是 Int,而不是类型 Date()(来自日期选择器)。有人可以帮我吗?谢谢

【问题讨论】:

请向我们展示一些关于您到目前为止所做的代码。 【参考方案1】:

您可以使用 CalendarDate 对象中获取 DateComponents

let componentsFromDate = Calendar.current.dateComponents(in: TimeZone.current, from: Date())

如果将Date() 替换为DatePicker 中的Date 对象,则可以使用componentsFromDate 创建UNCalendarNotificationTrigger

【讨论】:

感谢您的帮助,但由于某种原因,这不起作用......我收到的错误消息是“无法将类型“DateComponents”的值转换为类型“TimeInterval”(又名 Double)”。 ? 你还在用UNCalendarNotificationTrigger吗?听起来你正在使用UNTimeIntervalNotificationTrigger 嗯,是的,你是对的。我正在这样做。但是,我现在修复了它并且没有错误,但由于某种原因,在模拟器中,没有通知触发。上面的代码没有更新为日历触发器,而不是时间间隔触发器。还有什么我做错的事情阻止了它的工作。顺便说一句,感谢您迄今为止的所有帮助。我正在学习很多东西? UNUserNotificationCenter.current().add( 的完成处理程序中,您应该打印请求以查看它是否成功添加并打印其下一个触发日期,以查看可能出现的问题。您之前是否能够成功发送通知,您确定您的UNNotificationCenter 设置正确吗? 现在徽章出现了……但没有通知。我打印了请求和触发器,这就是它给我的(对我来说似乎没问题,但我知道什么)。哦,评论太长了,所以我把它放在上面的代码下。

以上是关于如何在 Swift 的日期选择器上设置本地通知时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在日期选择器上设置特定时间?

将本地通知设置为 swift 3 前 1 天或 2 天前

不同日期的本地通知 Swift 3

从我添加日期选择器并为其设置本地通知之日起,如何计算和显示另外 4 天?

如何阻止计划的本地通知在特定日期后触发?

在日期选择器上设置日期 jquery ui datepicker