2012-02-10 19 views
11

Actualmente tengo un temporizador con una alarma (notificación local).¿Cómo creo y cancelo UILocalNotification único de una clase personalizada?

Quiero crear una clase de temporizador a partir de este código para crear múltiples temporizadores y notificaciones (como máximo 5) y estoy luchando con la forma de crear y cancelar notificaciones únicas con un método de clase.

- (UILocalNotification *) startAlarm { 

    [self cancelAlarm]; //clear any previous alarms 

    alarm = [[UILocalNotification alloc] init]; 
    alarm.alertBody = @"alert msg" 
    alarm.fireDate = [NSDate dateWithTimeInterval: alarmDuration sinceDate: startTime]; 
    alarm.soundName = UILocalNotificationDefaultSoundName; 

    [[UIApplication sharedApplication] scheduleLocalNotification:alarm]; 

} 

Mi suposición es que si tengo un método de clase que crea una UILocalNotification llamada "alarma" iOS verán todas las notificaciones como la misma notificación y el siguiente método no funcionará de la manera que yo quiero que :

- (void)cancelAlarm { 

    if (alarm) {  
     [[UIApplication sharedApplication] cancelLocalNotification:alarm]; 
    } 

} 

así que necesito una manera de nombrar estos UILocalNotifications medida que se crean por ejemplo, alarm1 alarm2 ... alarm5 por lo que puedo cancelar el correcto.

Gracias de antemano.

+0

Puede almacenarlos en NSMutableArray o NSMutableDictionary (asignándoles una clave) y liberándolos al atravesar el contenedor. –

+0

Gracias, voy a intentarlo. –

Respuesta

32

La respuesta a su problema se encuentra en el parámetro del diccionario userInfo que tiene cada UILocalNotification. Puede establecer valores para las claves en este diccionario para identificar la notificación.

Para implementar esto fácilmente, todo lo que tiene que hacer es que su clase de temporizador tenga una propiedad de "nombre" NSString. Y use una cadena de toda la clase para la clave de ese valor. Aquí hay un ejemplo básico basado en su código:

#define kTimerNameKey @"kTimerNameKey" 

-(void)cancelAlarm{ 
    for (UILocalNotification *notification in [[[UIApplication sharedApplication] scheduledLocalNotifications] copy]){ 
     NSDictionary *userInfo = notification.userInfo; 
     if ([self.name isEqualToString:[userInfo objectForKey:kTimerNameKey]]){ 
      [[UIApplication sharedApplication] cancelLocalNotification:notification]; 
     } 
    } 
} 
-(void)scheduleAlarm{ 
    [self cancelAlarm]; //clear any previous alarms 
    UILocalNotification *alarm = [[UILocalNotification alloc] init]; 
    alarm.alertBody = @"alert msg"; 
    alarm.fireDate = [NSDate dateWithTimeInterval:alarmDuration sinceDate:startTime]; 
    alarm.soundName = UILocalNotificationDefaultSoundName; 
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:self.name forKey:kTimerNameKey]; 
    alarm.userInfo = userInfo; 
    [[UIApplication sharedApplication] scheduleLocalNotification:alarm]; 
} 

Esta implementación debe ser relativamente fácil de entender. Básicamente, cuando se llama a una instancia de la clase de temporizador -scheduleAlarm y está creando una nueva notificación, establece su propiedad de cadena "nombre" como el valor de kTimerNameKey. Por lo tanto, cuando esta instancia llame al -cancelAlarm, enumera el conjunto de notificaciones que buscan una notificación con su nombre para esa clave. Y si encuentra uno, lo elimina.

Imagino que su próxima pregunta será cómo darle a cada uno de sus temporizadores propiedad una cadena única. Dado que me he enterado de que está utilizando IB para crear instancias de ellas (de su otra pregunta al respecto) lo más probable sería hacer esto en viewDidLoad algo como:

self.timerA.name = @"timerA"; 
self.timerB.name = @"timerB"; 

También podría atar la propiedad nombre en una etiqueta del título puedes tener.

+0

¡Muchas gracias una vez más! Explicación muy clara, y un ejemplo de código sólido. Todo tiene sentido y funciona como un encanto. Sin embargo, algo que me intrigaba era por qué era necesario copiar las notificaciones de cheduled. –

+1

@jemicha Me alegro de poder ayudar. Para responder a su pregunta sobre por qué era necesario copiar 'scheduledLocalNotifications', no es así. Este es un ejemplo de mi extrema paranoia. Si Apple expone sus notificaciones internas de 'NSMutableArray', ya sea mediante un cambio de política (tan poco probable que sea risible) o un error, esta copia evitaría posibles problemas. Pero nuevamente, si lo deja afuera, probablemente nunca verá la diferencia. – NJones

+0

Donde pones '' 'dictionaryWithObject: self.name''' - ¿cómo cambias' '' self.name''' a una ID única? – Supertecnoboff

Cuestiones relacionadas