使用日期选择器的本地通知

Local notifcations using datepicker

我正在为我的 app.I 使用 localNotifications 有一个日期选择器,用户可以从中选择通知的日期和时间,我还有 3 个分段控件(每天、每周、每月)。我已经完成了编码对于 localnotification 及其 working.But,分段控制不起作用,如果一个人选择两次(下午 1 点)和第二次(下午 2 点),然后通知显示在我不显示的两次want.Below是代码

在appdelegate.swift

    let types:UIUserNotificationType = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound

    let myAlarmSetting:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: categories as Set<NSObject>)

    UIApplication.sharedApplication().registerUserNotificationSettings(myAlarmSetting)

在notifications.swift

@IBAction func NotificationButtonTapped(sender: AnyObject) {

    func cancelLocalNotificationsWithUUID(uuid: String) {
for item in UIApplication.sharedApplication().scheduledLocalNotifications {
    let notification = item as! UILocalNotification
    if let notificationUUID = notification.userInfo?["UUID"] as? String {
        if notificationUUID == uuid {
            UIApplication.sharedApplication().cancelLocalNotification(notification)
        }    
    }
    }
    }


    var notifications:UILocalNotification = UILocalNotification()
    notifications.fireDate = datePicker.date
    notifications.timeZone = NSTimeZone.defaultTimeZone()
    notifications.applicationIconBadgeNumber = UIApplication.sharedApplication().applicationIconBadgeNumber + 1
    notifications.soundName = UILocalNotificationDefaultSoundName
 notifications.userInfo = ["UUID": "YOUR NOTIFICATION ID"]
    switch(frequencysegmentedcontrol.selectedSegmentIndex){
    case 0:
        notifications.repeatInterval = NSCalendarUnit.CalendarUnitDay
        break;
    case 1:
        notifications.repeatInterval = NSCalendarUnit.CalendarUnitWeekOfYear
        break;
    case 2:
        notifications.repeatInterval = NSCalendarUnit.CalendarUnitYear
        break;
    default:
        notifications.repeatInterval = NSCalendarUnit(0)
        break;
    }
    notifications.alertBody = "quote of the day"
    notifications.category = "First_category"

    UIApplication.sharedApplication().scheduleLocalNotification(notifications)
}

func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
    application.applicationIconBadgeNumber = 0
}

发生这种情况是因为您在安排新通知时没有取消旧通知,您可以随时向通知添加信息,如下所示:

var notification = UILocalNotification()
...
notification.userInfo = ["UUID": "YOUR NOTIFICATION ID"]

并且每当您安排新通知时,您应该像这样取消旧通知:

func cancelLocalNotificationsWithUUID(uuid: String) {
    for item in UIApplication.sharedApplication().scheduledLocalNotifications {
        let notification = item as! UILocalNotification
        if let notificationUUID = notification.userInfo?["UUID"] as? String {
            if notificationUUID == uuid {
                UIApplication.sharedApplication().cancelLocalNotification(notification)
            }    
        }
    }
}

完整代码如下:

func cancelLocalNotificationsWithUUID(uuid: String) {
    for item in UIApplication.sharedApplication().scheduledLocalNotifications {
        let notification = item as! UILocalNotification
        if let notificationUUID = notification.userInfo?["UUID"] as? String {
            if notificationUUID == uuid {
                UIApplication.sharedApplication().cancelLocalNotification(notification)
            }
        }
    }
}

@IBAction func NotificationButtonTapped(sender: AnyObject) {

    cancelLocalNotificationsWithUUID("NotificationID")

    var notifications:UILocalNotification = UILocalNotification()
    notifications.fireDate = datePicker.date
    notifications.timeZone = NSTimeZone.defaultTimeZone()
    notifications.applicationIconBadgeNumber = UIApplication.sharedApplication().applicationIconBadgeNumber + 1
    notifications.soundName = UILocalNotificationDefaultSoundName

    switch(frequencysegmentedcontrol.selectedSegmentIndex){
    case 0:
        notifications.repeatInterval = NSCalendarUnit.CalendarUnitDay
        break;
    case 1:
        notifications.repeatInterval = NSCalendarUnit.CalendarUnitWeekOfYear
        break;
    case 2:
        notifications.repeatInterval = NSCalendarUnit.CalendarUnitYear
        break;
    default:
        notifications.repeatInterval = NSCalendarUnit(0)
        break;
    }

    notifications.userInfo = ["UUID": "NotificationID"]

    notifications.alertBody = "quote of the day"
    notifications.category = "First_category"

    UIApplication.sharedApplication().scheduleLocalNotification(notifications)
}

func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
    application.applicationIconBadgeNumber = 0
}