2012-02-10 2 views
11

В настоящее время у меня есть таймер с сигнализацией (местное уведомление).Как создать и отменить уникальное UILocalNotification из пользовательского класса?

Я хочу создать класс таймера из этого кода, чтобы создать несколько таймеров и уведомлений (не более 5), и я борюсь с тем, как создавать и отменить уникальные уведомления с помощью метода класса.

- (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]; 

} 

Мое предположение, что если у меня есть метод класса, который создает UILocalNotification под названием «тревога» IOS будет видеть все уведомления как то же самое уведомление и следующий метод не будет работать так, как я хочу его :

- (void)cancelAlarm { 

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

} 

Так что мне нужен способ назвать эти UILocalNotifications так, как они созданы, например alarm1 alarm2 ... alarm5 поэтому я могу отменить правильный.

Заранее спасибо.

+0

Вы можете сохранить их в NSMutableArray или NSMutableDictionary (назначая им ключ) и освободить их, пройдя контейнер. –

+0

Спасибо, я попробую. –

ответ

32

Ответ на вашу проблему лежит в параметре словаря userInfo, который имеет каждый UILocalNotification. Вы можете установить значения для ключей в этом словаре для идентификации уведомления.

Чтобы реализовать это, все, что вам нужно сделать, - это иметь свой класс таймера с свойством «имя» NSString. И используйте некоторую строку класса для ключа для этого значения. Вот базовый пример, основанный на вашем коде:

#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 и он создает новое уведомление, оно устанавливает его свойство «имя» в качестве значения для kTimerNameKey. Поэтому, когда этот экземпляр вызывает -cancelAlarm, он перечисляет массив уведомлений, ищущих уведомление с его именем для этого ключа. И если он находит один, он удаляет его.

Я предполагаю, что ваш следующий вопрос будет заключаться в том, как дать каждому свойству имя таймера уникальную строку. Так как я знаю, вы используете IB, чтобы их экземпляры (от другого вопроса по этому вопросу), вы, скорее всего, сделать это в viewDidLoad что-то вроде:

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

Вы также можете связать свойство имени с использованием титульного этикетки ты можешь иметь.

+0

Еще раз спасибо! Очень четкое объяснение и пример с твердым кодом. Все имеет смысл, и это работает как шарм. Единственное, что мне было интересно, однако, было то, что нужно было скопировать cheduledNotifications. –

+1

@jemicha Рад, что я мог бы помочь. Чтобы ответить на ваш вопрос о том, почему необходимо было скопировать «schedLocalNotifications», это не так. Это пример моей крайней паранойи. Если Apple когда-либо раскрывает его внутренние уведомления NSMutableArray, либо путем изменения политики (что маловероятно, что это смешно), либо ошибки, то эта копия позволит избежать возможных проблем. Но опять же, если вы оставите это, вы, вероятно, никогда не увидите разницы. – NJones

+0

Где вы помещаете '' 'dictionaryWithObject: self.name''' - как вы меняете' '' self.name''' на уникальный идентификатор? – Supertecnoboff

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