2015-08-11 3 views
12

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

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

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

ответ

34

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

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

Или как заявлено Logan:

UIApplication.sharedApplication().cancelAllLocalNotifications() 

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

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

Если вы все равно отмените их, возможно, просто используйте: \t \t 'UIApplication.sharedApplication(). cancelAllLocalNotifications()' – Logan

+0

Или что! xD Хороший вклад. Благодаря! –

+0

Отмена локального уведомления, но не отменяет пользовательский звук, так как его воспроизведение происходит непрерывно примерно от 3 до 4 секунд. –

-2

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

так у вас есть

- IBAction methodName{ 

//scheduleNotification 
//cancelNotification 
} 

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

Bool didCancel; 

- IBAction methodName{ 

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

проверить мой отредактированный вопрос сейчас – sumesh

1

Вы можете сохранить уникальное значение ключа в пользовательское имя вашего локального уведомления и отмените его, получив локальное значение, используя значение этого ключа. Попробуйте это (для Objective 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

Решения для прошивки 10+ Swift 3,1

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

для Swift 3.0 и прошивки 10:

UNUserNotificationCenter.current().removeAllDeliveredNotifications()