как отменить localNotification нажатием кнопки в swift?

я планирую расположение на основе UILocalNotification одним нажатием кнопки . Но когда я пытаюсь отменить localNotification, снова нажав ту же кнопку, он не отменяет уведомление. Я использую UIApplication.sharedApplication().cancelLocalNotification(localNotification) чтобы отменить мое запланированное локальное уведомление на основе местоположения. Что я делаю не так ? вот моя реализация

@IBAction func setNotification(sender: UIButton!) {
    if sender.tag == 999 {
        sender.setImage(UIImage(named: "NotificationFilled")!, forState: .Normal)
        sender.tag = 0
        regionMonitor() //function where notification get scheduled

    } else {
        sender.setImage(UIImage(named: "Notification")!, forState: .Normal)
        sender.tag = 999 }

что я должен ввести в блок else, чтобы запланированное уведомление было отменено. Не удается очистить все уведомления. вот это didEnterRegion блок-код, где я запускаю локальное уведомление

func locationManager(manager: CLLocationManager!, didEnterRegion region: CLRegion!) {
    localNotification.regionTriggersOnce = true
    localNotification.alertBody = "Stack Overflow is great"
    UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
    NSLog("Entering region")
}

5 ответов


вы можете попытаться удалить все уведомления, если это приемлемо в вашем контексте. Вот так:

for notification in UIApplication.sharedApplication().scheduledLocalNotifications as! [UILocalNotification] { 
  UIApplication.sharedApplication().cancelLocalNotification(notification)
}

или как заявил Логан:

UIApplication.sharedApplication().cancelAllLocalNotifications()

или, как заявил Джерард Гранди для Swift 4:

UNUserNotificationCenter.current().removeAllPendingNotificat‌​ionRequests()

решение для iOS 10 + Swift 3.1

let center = UNUserNotificationCenter.current()
center.removeAllDeliveredNotifications() // To remove all delivered notifications
center.removeAllPendingNotificationRequests()

вы можете сохранить уникальное значение для ключа в userinfo локального уведомления и отменить его, получив localnotification, используя значение этого ключа. Попробуйте это (для цели C):

NSArray *notifArray = [[UIApplication sharedApplication] scheduledLocalNotifications];
for (int i=0; i<[notifArray count]; i++)
{
    UILocalNotification* notif = [notifArray objectAtIndex:i];
    NSDictionary *userInfoDict = notif.userInfo;
    NSString *uniqueKeyVal=[NSString stringWithFormat:@"%@",[userInfoDict valueForKey:@"UniqueKey"]];
    if ([uniqueKeyVal isEqualToString:keyValToDelete])
    {
        [[UIApplication sharedApplication] cancelLocalNotification:notif];
        break;
    }
}

для Swift 3.0 и iOS 10:

UNUserNotificationCenter.current().removeAllDeliveredNotifications()

трудно сказать, не видя реализации кода.

Так что у вас есть

- IBAction methodName{

//scheduleNotification
//cancelNotification
}

Это правда? Если это так, добавьте bool so

Bool didCancel;

- IBAction methodName{

if didCancel == No{
//scheduleNotification
didCancel = YES;
}else if didCancel == YES{
//cancelNotifications
didCancel = NO;
}