如何从自定义类创build和取消唯一的UILocalNotification?

目前我有一个闹钟定时器(本地通知)。

我想从这个代码创build一个计时器类来创build多个计时器和通知(最多5个),我正在努力如何创build和取消与类方法的唯一通知。

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

我的假设是,如果我有一个类方法创build一个名为“警报”的UILocalNotification iOS会看到所有的通知是相同的通知,下面的方法将不会按照我希望的方式运行:

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

所以我需要一种方式来命名这些UILocalNotifications,因为它们被创build,例如alarm1 alarm2 … alarm5,所以我可以取消正确的。

提前致谢。

您的问题的答案在于每个UILocalNotification具有的userInfo字典参数。 您可以在此字典中为键设置值以标识通知。

为了实现这一点很容易,你所要做的就是让你的timer类有一个NSString “name”属性。 并使用一些类宽string作为该值的关键字。 这是一个基于你的代码的基本例子:

 #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并且正在创build一个新的通知时,它将string属性“name”设置为kTimerNameKey的值。 所以当这个实例调用-cancelAlarm它枚举了一个通知数组,该通知使用该键的名称来查找通知。 如果它find一个它删除它。

我想你的下一个问题将是如何给你的每个定时器名称属性一个唯一的string。 因为我碰巧知道你正在使用IB来实例化它们(从你对这个问题的其他问题),你可能会做这个viewDidLoad东西:

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

您也可以将名称属性与您可能拥有的标题标签绑定。