Ответ 1
Ответ на вашу проблему лежит в параметре словаря userInfo
, который есть у каждого UILocalNotification
. Вы можете установить значения для ключей в этом словаре, чтобы идентифицировать уведомление.
Чтобы реализовать это, все, что вам нужно сделать, это иметь свой класс таймера с NSString
"name". И используйте некоторую строку класса для ключа для этого значения. Вот базовый пример, основанный на вашем коде:
#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];
}
Эта реализация должна быть относительно понятной. В основном, когда экземпляр класса таймера вызвал -scheduleAlarm
и он создает новое уведомление, он устанавливает для него свойство string "name" как значение для kTimerNameKey
. Поэтому, когда этот экземпляр вызывает -cancelAlarm
, он перечисляет массив уведомлений, ищущих уведомление с этим именем для этого ключа. И если он находит один, он удаляет его.
Я предполагаю, что ваш следующий вопрос будет заключаться в том, как дать каждому свойству имя таймера уникальную строку. Поскольку я знаю, что вы используете IB для их создания (из вашего другого вопроса по этому вопросу), вы, вероятно, сделаете это в viewDidLoad
что-то вроде:
self.timerA.name = @"timerA";
self.timerB.name = @"timerB";
Вы также можете связать свойство name с ярлыком заголовка, который у вас может быть.