2013-04-18 4 views
1

Я пытаюсь отменить уже запланированное уведомление, уведомление вызывается, но когда я пытаюсь отменить уведомление, оно не отменяется.UILocalNotification не отменяется

Уведомление NSArray содержит некоторые случайные значения, когда есть только одно запланированное уведомление. Может кто-нибудь мне помочь . Я хочу отменить уведомление для определенного идентификатора книги.

UPDATE:

-(UILocalNotification *)scheduleNotification :(int)remedyID 
     { 
      NSString *descriptionBody; 

      NSInteger frequency; 

      UILocalNotification *notif = [[UILocalNotification alloc] init]; 

      NSLog(@"%d",remedyID); 

      descriptionBody =[[self remedyDetailsForRemedyID:remedyID] objectForKey:@"RemedyTxtDic"]; 
      frequency = [[[self remedyDetailsForRemedyID:remedyID] objectForKey:@"RemedyFrequency"]intValue]; 

      NSArray *notificationFireDates = [self fireDatesForFrequency:frequency]; 

      for (NSDate *fireDate in notificationFireDates) 
      { 
        notif.timeZone = [NSTimeZone defaultTimeZone]; 


        notif.repeatInterval = NSDayCalendarUnit; 
        notif.alertBody = [NSString stringWithString:descriptionBody]; 
        notif.alertAction = @"Show me"; 
        notif.soundName = UILocalNotificationDefaultSoundName; 

        notif.applicationIconBadgeNumber = 1; 

        notif.fireDate = fireDate; 

        NSDictionary *userDict = [NSDictionary dictionaryWithObjectsAndKeys:notif.alertBody,           @"kRemindMeNotificationDataKey", [NSNumber numberWithInt:remedyID],kRemindMeNotificationRemedyIDKey, 
               nil]; 

        notif.userInfo = userDict; 

        [[UIApplication sharedApplication] scheduleLocalNotification:notif]; 
       } 

       return notif; 

    } 



- (void)cancelNotification:(int)bookID 
{ 
    int notificationBook=0; 

     NSArray *notifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; 

    for (UILocalNotification *notification in notifications) 
    { 
     int notifBookId = [[notification.userInfo objectForKey:kRemindMeNotificationBookIDKey] intValue]; 


     for (int i=0; i<[bookArray count]; i++) 
     { 
      notificationBook =[[[remedyArray objectAtIndex:i] objectForKey:@"BookID"] intValue]; 
     } 

     NSLog(@"%d",[[notification.userInfo objectForKey:kRemindMeNotificationBookIDKey]intValue]); 

     NSLog(@"%d",notifBookId); 

     if (bookId == notifBookId) 
     { 
      [[UIApplication sharedApplication] cancelLocalNotification:notification]; 
     } 
    } 

} 
+0

вы можете войти в если цикл? – manujmv

ответ

2

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

Возможно, это связано с некоторыми ранее запланированными уведомлениями о том, что приложение уже существует. После того, как пытаются отменить все уведомления о приложение снова начинает

[[UIApplication sharedApplication] cancelAllLocalNotifications]; 

Ваша главная проблема

- (void)cancelNotification:(int)remedyId 
{ 
NSArray *notifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; 
NSLog(@"Cancelling... Before %d",[[[UIApplication sharedApplication]scheduledLocalNotifications]count]); 

    for (UILocalNotification *notification in notifications) 
    { 

    int notifRemedyId = [[notification.userInfo objectForKey:@"kRemindMeNotificationRemedyIDKey"]intValue]; // I change the key value 

    NSLog(@"remedyID : %d",remedyId); 
    NSLog(@"notifyId : %d",notifRemedyId); 
    if (remedyId == notifRemedyId) { 
     [[UIApplication sharedApplication] cancelLocalNotification:notification]; 
     } 
    } 

NSLog(@"Cancelling... After %d",[[[UIApplication sharedApplication]scheduledLocalNotifications]count]); 


} 

Ключ вы дали ошибалась. Думаю, это была твоя проблема. Я вычислил еще одну вещь, которую вы планируете каждое уведомление дважды, я не знаю, почему. Проверьте это.

+0

тогда, когда есть два уведомления, которые будут уволены, тогда он не будет отображаться в заблокированном экране – raptor

+0

Я имею в виду отменить все уведомления только один раз. После запуска один раз вы можете удалить этот код (это для удаления нежелательного уведомления). Затем проверьте количество уведомлений так же, как количество уведомлений, которые вы запланировали. –

+0

. Я попытаюсь поделиться своим кодом. Поместите свой проект в папку [Drop box] (https://www.dropbox.com/referrals/NTMwNzUzNTQ3OQ?src= global9) –

0

Вы должны переместить проверить внутри цикла

for (int i=0; i<[bookArray count]; i++) 
{ 
    int bookId =[[[remedyArray objectAtIndex:i] objectForKey:@"BookID"] intValue]; 

    if (bookId == notifBookId) 
    { 
     [[UIApplication sharedApplication] cancelLocalNotification:notification]; 
    } 
} 
+0

Также почему вы используете bookArray для подсчета в цикле и исправления массива, чтобы вытащить объект – RJR

Смежные вопросы