2012-02-10 19 views
11

Obecnie mam zegar z alarmem (powiadomienie lokalne).Jak utworzyć i anulować unikalne UILocalNotification z niestandardowej klasy?

Chcę utworzyć klasę licznika czasu z tego kodu, aby utworzyć wiele liczników czasu i powiadomień (maksymalnie 5) i zmagam się z tym, jak tworzyć i anulować unikalne powiadomienia za pomocą metody klasy.

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

} 

Moje założenie jest, że jeśli mam metody klasy, która tworzy UILocalNotification nazwie „alarm” iOS będzie zobaczyć wszystkie powiadomienia traktować tak samo zgłoszenie i następująca metoda nie będzie działać tak, jak ma to :

- (void)cancelAlarm { 

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

} 

Potrzebuję więc sposobu na nadanie nazwy tym UILocalNotification, ponieważ są one tworzone np. alarm1 alarm2 ... alarm5, więc mogę anulować prawy.

Z góry dziękuję.

+0

Można przechowywać je w NSMutableArray lub NSMutableDictionary (przypisując im klucz) i zwolnić je, przechodząc przez kontener. –

+0

Dzięki, spróbuję. –

Odpowiedz

32

Odpowiedź na twój problem leży w parametrze słownika userInfo, który ma każdy UILocalNotification. Możesz ustawić wartości dla kluczy w tym słowniku, aby zidentyfikować powiadomienie.

Aby to wdrożyć w łatwy sposób, musisz mieć klasę czasomierza o nazwie "nazwa" o numerze NSString. I użyj łańcucha o szerokości klasy dla klucza dla tej wartości. Oto podstawowy przykład oparty na twoim kodzie:

#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]; 
} 

Ta implementacja powinna być względna. Zasadniczo, gdy instancja klasy zegara ma nazwę -scheduleAlarm, która tworzy nowe powiadomienie, ustawia ją jako właściwość łańcucha "nazwa" jako wartość dla kTimerNameKey. Tak więc, gdy ta instancja wywołuje -cancelAlarm, wylicza tablicę powiadomień, szukając powiadomienia o nazwie dla tego klucza. A jeśli znajdzie, to go usuwa.

Wyobrażam sobie, że następnym pytaniem będzie, w jaki sposób nadać każdemu z timerów nazwę własnemu unikatowemu ciągowi znaków. Ponieważ zdarza mi znać używasz IB ich wystąpienia (z drugiego pytania w tej sprawie) byś prawdopodobnie zrobić w viewDidLoad coś takiego:

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

Można także powiązać właściwość name w etykietą tytułowego możesz mieć.

+0

Jeszcze raz dziękuję! Bardzo jasne wyjaśnienie i solidny przykład kodu. Wszystko ma sens i działa jak urok. Jedną z rzeczy, które mnie ciekawiły było to, dlaczego konieczne było skopiowanie notatek cheduled. –

+1

@jemicha Cieszę się, że mogłem pomóc. Aby odpowiedzieć na pytanie, dlaczego konieczne było skopiowanie "Zaplanowanych Powiadomień Lokalnych", nie jest. To jest przykład mojej skrajnej paranoi. Jeśli jabłko kiedykolwiek ujawnia wewnętrzne "NSMutableArray" powiadomień, albo przez zmianę polityki (tak mało prawdopodobne, że to śmieszne) lub błąd, to ta kopia uniknie ewentualnych problemów. Ale znowu, jeśli go opuścisz, prawdopodobnie nigdy nie zobaczysz różnicy. – NJones

+0

Gdzie wstawiasz '' dictionaryWithObject: self.name''' - jak zmienić '' 'self.name''' na unikalny identyfikator? – Supertecnoboff

Powiązane problemy