2015-08-11 8 views
12

Sto pianificando una posizione basata UILocalNotification con il clic di un pulsante. Ma quando provo a cancellare LocalNotification facendo di nuovo clic sullo stesso pulsante, non annulla la notifica. Sto usando UIApplication.sharedApplication().cancelLocalNotification(localNotification) per cancellare la mia notifica locale basata sulla localizzazione pianificata. Cosa sto sbagliando? qui è la mia realizzazionecome annullare una LocalNotification con la semplice pressione di un pulsante in swift?

@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 } 

che cosa devo entrare nel blocco gli altri in modo che la notifica in programma viene cancellato. Impossibile cancellare tutte le notifiche. Ecco il codice didEnterRegion blocco in cui i innescare la notifica locale

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

risposta

34

Si potrebbe provare a rimuovere tutte le notifiche se questo è accettabile nel proprio contesto. Ti piace questa:

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

O come affermato da Logan:

UIApplication.sharedApplication().cancelAllLocalNotifications() 

O come affermato da Gerard Grundy per Swift 4:

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

Se hai intenzione di cancellare tutti loro a prescindere, potrebbe probabilmente semplicemente usare: \t \t 'UIApplication.sharedApplication(). cancelAllLocalNotifications()' – Logan

+0

O quello! xD Bel contributo. Grazie! –

+0

Annulla la notifica locale ma non cancella il suono personalizzato mentre viene riprodotto ininterrottamente da 3 a 4 secondi. –

-2

Difficile dirlo senza vedere l'applicazione del codice.

in modo da avere un

- IBAction methodName{ 

//scheduleNotification 
//cancelNotification 
} 

è che circa il giusto? Se è così aggiungi un bool in modo

Bool didCancel; 

- IBAction methodName{ 

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

controllare la mia domanda modificato ora – sumesh

1

è possibile salvare un valore unico per la chiave in l'utenteinfo della notifica locale e lo annulla ottenendo la notazione locale utilizzando il valore di tale chiave. Prova questo (per l'obiettivo 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; 
    } 
} 
2

soluzione per iOS 10+ Swift 3,1

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

per SWIFT 3.0 e iOS 10:

UNUserNotificationCenter.current().removeAllDeliveredNotifications()