2012-06-21 16 views
5

Sé que hay algunas preguntas here y there con respecto a cómo eliminar una notificación local que podría ser una o una notificación en particular.También he pasado por el local notification class reference y encontré algunos métodos como intervalo de tiempo de repetición, fecha de inicio de sesión, cuerpo de alerta, zona horaria, etc. ... pero no puedo encontrar algún tipo de información sobre cómo modificar la fecha de inicio ya establecida. Diga si el usuario establece una notificación con fecha hoy y a las 4:50 p.m., pero si el usuario desea modificar la fecha/hora establecida, lo que está sucediendo es que la notificación se activa en ambas ocasiones. ¡Lo cual es un error en cuanto a la ética de la programación!Actualizar la fecha de inicio para la notificación local y cancelar la notificación anterior

En realidad, lo que quiero es que se cancele la notificación anterior, es decir, la fecha debe modificarse para ser editada y la notificación debe establecerse y activarse en la nueva fecha.

Éste es cómo programar la notificación, código de ejemplo:

- (void)setNotification 
{ 
    //Set notification after confirmation of saved data 

    Class cls = NSClassFromString(@"UILocalNotification"); 
    reminderNotification = [[cls alloc] init]; 

    if (cls != nil) 
    {   
     NSDateFormatter *dateFormat = [[[NSDateFormatter alloc]init]autorelease]; 
     [dateFormat setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; 
     NSDate *notificationDate = [dateFormat dateFromString:textField2.text]; 
     reminderNotification.fireDate = notificationDate; 
     reminderNotification.timeZone = [NSTimeZone defaultTimeZone]; 
     NSString *reminderText = [NSString stringWithFormat:@"%@ 's %@ on %@",textField.text,textField1.text,strDate]; 
     reminderNotification.alertBody = reminderText; 
     reminderNotification.alertAction = @"View"; 
     reminderNotification.soundName = @"lazy_afternoon.mp3"; 
     reminderNotification.applicationIconBadgeNumber = 1; 
     NSDictionary *userDict = [NSDictionary dictionaryWithObject:self.textField1.text forKey:kReminder]; 
     reminderNotification.userInfo = userDict; 
     [[UIApplication sharedApplication] scheduleLocalNotification:reminderNotification]; 
     [reminderNotification release]; 
    } 
} 

Puede alguno por favor me guía en el camino correcto sobre cómo hacer frente a esta tarea.

Gracias a todos de antemano :)

Respuesta

18

Utilice este método para programar notificación, cuando la notificationID tiene que ser único

-(void) scheduleNotificationForDate:(NSDate *)date AlertBody:(NSString *)alertBody ActionButtonTitle:(NSString *)actionButtonTitle NotificationID:(NSString *)notificationID{ 

    UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
    localNotification.fireDate = date; 
    localNotification.timeZone = [NSTimeZone localTimeZone]; 
    localNotification.alertBody = alertBody; 
    localNotification.alertAction = actionButtonTitle; 
    localNotification.soundName = @"yourSound.wav"; 

    NSDictionary *infoDict = [NSDictionary dictionaryWithObject:notificationID forKey:notificationID]; 
    localNotification.userInfo = infoDict; 

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
} 

Utilice este método para cancelar notificación específica con que Id Notificación

- (void)cancelLocalNotification:(NSString*)notificationID { 
    //loop through all scheduled notifications and cancel the one we're looking for 
    UILocalNotification *cancelThisNotification = nil; 
    BOOL hasNotification = NO; 

    for (UILocalNotification *someNotification in [[UIApplication sharedApplication] scheduledLocalNotifications]) { 
     if([[someNotification.userInfo objectForKey:notificationID] isEqualToString:notificationID]) { 
      cancelThisNotification = someNotification; 
      hasNotification = YES; 
      break; 
     } 
    } 
    if (hasNotification == YES) { 
     NSLog(@"%@ ",cancelThisNotification); 
     [[UIApplication sharedApplication] cancelLocalNotification:cancelThisNotification];   
    } 
} 

Referencia : UILocalNotification

+0

Una pequeña duda, puedo declarar el ID de notificación en la notificación de programación en lugar de colocarlo en el método :) –

+0

Porque necesito llamar [self scheduleNotification] en la acción del botón Guardar, si lo escribo, ¿cómo puedo acceder? todas esas variables y colocarlo en el método en sí :( –

+0

permítame considerar que tiene el contenido fireDate y alertBody en el método [self scheduleNotification], por lo que puede reescribir el método anterior como - (void) scheduleNotificationForNotificationID: (NSString *) notificationID; ignorando esos parámetros que ya tienes, y puedes usar ese método en el botón de guardar como [self scheduleNotificationForNotificationID: @ "yourUniqueId"]; – Bala

3

Una vez que se establece la notificación, la única manera de editarlo, está cancelando el anterior y volver a crear otro, lo que puede hacer de esta manera, la búsqueda de su existente y cancelarla .

for(UILocalNotification *aNotif in [[UIApplication sharedApplication] scheduledLocalNotifications]) { 
     if([[aNotif.userInfo objectForKey:@"id"] isEqualToString:nId]) { 
      [[UIApplication sharedApplication]cancelLocalNotification:aNotif]; 
     } 
    } 

Y a continuación, crea una nueva notificación.

+0

Lo siento, no puedo entender cuál es la clave aquí, si creara una identificación para cada notificación, si es así, cómo configurarla, por favor amplifícame, soy nuevo en las notificaciones locales, por favor mira mi código sobre cómo estoy configurando la notificación, gracias :) –

+0

Es simple, solo necesitas tener una clave única que la generes y la almacenes, y usándola puedes enviar notificaciones y usar la misma clave para cancelarla. Si tienes una sola notificación, puedes almacenar en NSUserDefaults, si no necesita una base de datos para entradas múltiples. – Dhruv

Cuestiones relacionadas