iOS如何取消预定的本地通知

时间:2011-09-08 15:28:43

标签: iphone ios xcode nsuserdefaults uilocalnotification

我正在编写一个iPhone应用程序,其中我有三个倒计时器,每个计时器在用户启动时设置本地通知(IBAction)。

我的问题是,如何在代码中的其他地方引用现有的本地通知?我试过像这样直接引用它崩溃了:

[[UIApplication sharedApplication] cancelLocalNotification:myNotification];

在安排通知并将其添加到用户默认值之后,就像这样:

In my scheduling method...
[myDefaults setObject:myNotification forKey:@"myNotification"];
...

And in my cancelling method...
NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults];
[[UIApplication sharedApplication] cancelLocalNotification:[myDefaults objectForKey:@"myNotification"]];
[myDefaults synchronize];

我的应用程序因上面的cancelLocalNotification行上的SIGABRT错误而崩溃。谁能告诉我哪里出错了?

提前致谢!

3 个答案:

答案 0 :(得分:2)

好的,经过一步一步的思考,我找到了解决问题的有效方法。我发现我完全以错误的方式处理整个问题!

基本上,我发现当应用程序处于活动状态时(即在前台),您不需要任何本地通知。因此,当计时器启动时,我不会设置本地通知,而是在应用程序即将辞职时设置相关通知。

我将这些观察者放在我的viewDidLoad;

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appWillResign) name:UIApplicationWillResignActiveNotification 
object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appIsActive) name:UIApplicationDidBecomeActiveNotification 
object:nil];

在我的appWillResign方法中,我为任何活动的计时器设置了通知。当应用程序恢复时,我只需取消所有通知。

[[UIApplication sharedApplication] cancelAllLocalNotifications];

简而言之,您不需要在代码中的其他位置引用通知。您只需在绝对需要时进行设置:当应用程序背景时!所以你真的不需要将它们“存储”在任何地方以备日后使用。

感谢您对@Learner的贡献,您帮助我走上正轨! :d

答案 1 :(得分:1)

很难预测,但一般来说,当您访问nil或已发布的对象时会出现SIGABRT。

所以在[[UIApplication sharedApplication] cancelLocalNotification:myNotification];`

它可以是“myNotification”,它是零。

[myDefaults objectForKey:@"myNotification"] returns nil

可能的原因可能是NsUserDefaults只存储了几个数据类型,如以下类引用中所述。

  

默认对象必须是属性列表,即(或集合的实例组合)的实例:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。如果要存储任何其他类型的对象,通常应将其存档以创建NSData实例。

我可以预测的是, myNotification存储的类型为UILocalNotification.,因此可能存储数据失败。

如果上述情况不起作用,请进一步调试代码并发布。

答案 2 :(得分:0)

修复方法是同步NSUserDefaults。我假设你只是设置了对象而没有同步它。如果是这样,对象实际上不会保存到NSUserDefaults,而只是保存到本地NSUserDefaults对象。您需要做的是在设置对象后调用[defaults synchronize]