我正在编写一个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错误而崩溃。谁能告诉我哪里出错了?
提前致谢!
答案 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]
。