gpt4 book ai didi

objective-c - 如何从自定义类创建和取消唯一的 UILocalNotification?

转载 作者:技术小花猫 更新时间:2023-10-29 10:42:25 26 4
gpt4 key购买 nike

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

我想从这段代码创建一个计时器类来创建多个计时器和通知(最多 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];

}

我的假设是,如果我有一个创建名为“alarm”的 UILocalNotification 的类方法,iOS 会将所有通知视为相同的通知,并且以下方法将无法按我希望的方式运行:

- (void)cancelAlarm {

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

}

所以我需要一种在创建时命名这些 UILocalNotifications 的方法,例如alarm1 alarm2...alarm5 这样我就可以取消正确的。

提前致谢。

最佳答案

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

要轻松实现这一点,您所要做的就是让您的计时器类具有 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 并且它正在创建一个新通知时,它会将其字符串属性“name”设置为 kTimerNameKey 的值。因此,当此实例调用 -cancelAlarm 时,它会枚举通知数组以查找具有该键名称的通知。如果它找到一个,就会将其删除。

我想您的下一个问题是如何为每个计时器名称属性指定一个唯一的字符串。由于我碰巧知道您正在使用 IB 来实例化它们(从您关于此事的其他问题),您可能会在 viewDidLoad 中执行此操作,例如:

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

您还可以将名称属性与您可能拥有的标题标签联系起来。

关于objective-c - 如何从自定义类创建和取消唯一的 UILocalNotification?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9232490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com