Как да създам и отменя уникално 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, тъй като са създадени, напр. аларма1 аларма2...аларма5, за да мога да отменя правилната.

Благодаря предварително.


person Michael Campsall    schedule 10.02.2012    source източник
comment
Можете да ги съхранявате в NSMutableArray или NSMutableDictionary (присвояване на ключ към тях) и да ги освободите, като преминете през контейнера.   -  person Joel Kravets    schedule 11.02.2012
comment
Благодаря, ще опитам.   -  person Michael Campsall    schedule 12.02.2012


Отговори (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 извикан и той създава ново известие, той задава своето свойство на низ "име" като стойност за kTimerNameKey. Така че, когато този екземпляр извиква -cancelAlarm, той изброява масива от известия, търсейки известие със своето име за този ключ. И ако намери такъв, го премахва.

Предполагам, че следващият ви въпрос ще бъде как да дадете на всяко от свойството име на таймерите уникален низ. Тъй като случайно знам, че използвате IB, за да ги създадете (от другия ви въпрос по въпроса), вероятно ще направите това в viewDidLoad нещо като:

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

Можете също така да свържете свойството име с етикет за заглавие, който може да имате.

person NJones    schedule 16.02.2012
comment
Благодаря още веднъж! Много ясно обяснение и солиден примерен код. Всичко има смисъл и работи като чар. Едно нещо, за което обаче бях любопитен, беше защо е необходимо да се копират cheduledNotifications. - person Michael Campsall; 17.02.2012
comment
@jemicha Радвам се, че мога да помогна. За да отговоря на въпроса ви защо е било необходимо да копирате scheduledLocalNotifications, не е. Това е пример за моята крайна параноя. Ако Apple някога разкрие своите вътрешни NSMutableArray известия, или чрез промяна на правилата (толкова малко вероятно е смешно), или бъг, тогава това копие ще избегне възможни проблеми. Но отново, ако го оставите, вероятно никога няма да видите разлика. - person NJones; 18.02.2012
comment
Къде поставяте dictionaryWithObject:self.name - как променяте self.name на уникален идентификатор? - person Supertecnoboff; 20.03.2016