¿Cómo creo y cancelo la UILocalNotification única de una class personalizada?

Actualmente tengo un timer con una alarma (notificación local).

Quiero crear una class de timer de este código para crear múltiples timeres y notifications (como máximo 5) y estoy luchando con la forma de crear y cancelar notifications únicas con un método de class.

- (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 shanetworkingApplication] scheduleLocalNotification:alarm]; } 

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

 - (void)cancelAlarm { if (alarm) { [[UIApplication shanetworkingApplication] cancelLocalNotification:alarm]; } } 

Entonces necesito una forma de nombrar estas UILocalNotifications a medida que se crean, por ejemplo, alarm1 alarm2 … alarm5 para que pueda cancelar la correcta.

Gracias por adelantado.

La respuesta a su problema reside en el parámetro del dictionary UILocalNotification tiene cada UILocalNotification . Puede establecer los valores de las keys en este dictionary para identificar la notificación.

Para implementar esto fácilmente, todo lo que tiene que hacer es tener su class de timer con una NSString "nombre" de NSString . Y use una cadena de class amplia para la key para ese valor. Aquí hay un ejemplo básico basado en su código:

 #define kTimerNameKey @"kTimerNameKey" -(void)cancelAlarm{ for (UILocalNotification *notification in [[[UIApplication shanetworkingApplication] scheduledLocalNotifications] copy]){ NSDictionary *userInfo = notification.userInfo; if ([self.name isEqualToString:[userInfo objectForKey:kTimerNameKey]]){ [[UIApplication shanetworkingApplication] 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 shanetworkingApplication] scheduleLocalNotification:alarm]; } 

Esta implementación debería ser relativamente explicativa. Básicamente cuando una instancia de la class de timer ha llamado -scheduleAlarm y está creando una nueva notificación, establece su propiedad de cadena "nombre" como el valor para la kTimerNameKey . Entonces, cuando esta instancia llama -cancelAlarm enumera el set de notifications que buscan una notificación con su nombre para esa key. Y si encuentra uno, lo elimina.

Imagino que tu próxima pregunta será cómo otorgarle a cada una de las properties de tu nombre de timer una cadena única. Como sé que está utilizando IB para instanciarlos (a partir de su otra pregunta al respecto) es probable que haga esto en viewDidLoad algo así como:

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

También podría vincular la propiedad de nombre con una label de título que pueda tener.