Vraag Hoe maak en annuleer ik unieke UILocalNotification van een aangepaste klasse?


Momenteel heb ik een timer met een alarm (lokale melding).

Ik wil een tijdklokklasse maken op basis van deze code om meerdere timers en meldingen te maken (maximaal 5) en ik worstel met het maken en annuleren van unieke meldingen met een klassemethode.

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

}

Mijn aanname is dat als ik een klassemethode heb die een UILocalNotification creëert met de naam "alarm", iOS alle meldingen zal zien als dezelfde melding en de volgende methode zal niet werken zoals ik wil:

- (void)cancelAlarm {

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

}

Dus ik heb een manier nodig om deze UILocalNotifications een naam te geven, zoals ze bijvoorbeeld zijn gemaakt. alarm1 alarm2 ... alarm5 zodat ik de juiste kan annuleren.

Bij voorbaat bedankt.


11
2018-02-10 17:58


oorsprong


antwoorden:


Het antwoord op uw probleem ligt in de userInfo woordenboekparameter die elke UILocalNotification heeft. U kunt waarden voor sleutels in dit woordenboek instellen om de melding te identificeren.

Om dit gemakkelijk te implementeren, hoef je alleen maar je timer-klas te hebben NSString "naam" -eigenschap. En gebruik een klassebrede string voor de sleutel voor die waarde. Hier is een eenvoudig voorbeeld op basis van uw code:

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

Deze implementatie moet relatief zelfverklarend zijn. In principe wanneer een instantie van de timer-klasse heeft -scheduleAlarm heeft geroepen en er wordt een nieuwe melding gemaakt waarin de tekenreekseigenschap "name" wordt ingesteld als de waarde voor de kTimerNameKey. Dus wanneer deze instantie roept -cancelAlarm het somt de reeks meldingen op die op zoek zijn naar een melding met de naam van die sleutel. En als het er een vindt, verwijdert het het.

Ik stel me voor dat je volgende vraag zal zijn hoe je elk van je timers de naam property een unieke tekenreeks kunt geven. Aangezien ik toevallig weet dat je IB gebruikt om ze te instantiëren (vanuit je andere vraag over de kwestie) zou je dit waarschijnlijk doen viewDidLoad zoiets als:

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

U kunt de eigenschap name ook koppelen aan een titellabel dat u heeft.


32
2018-02-16 04:07