我正在尝试更改 AppDelegate 中推送通知的数量。
我创建了一个属性并将其合成到 AppDelegate.h 中,用于存储带有通知数据的 NSDictionary。
@property (strong,nonatomic) NSMutableDictionary *pushArray;
当我收到通知时,我会这样做:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
_pusharray = [[userInfo valueForKey:@"aps"] valueForKey:@"badges"];
}
我在另一个文件(例如 mainViewController)中收到通知,但我无法删除 _pusharray 中的项目。 我是这样做的:
- (IBAction)touchMaenuButtons:(id)sender {
NSUInteger index = [self.menuButtons indexOfObject:sender];
NSMutableDictionary *pushArray = [(AppDelegate *)[[UIApplication sharedApplication] delegate] pushArray];
NSString *key = [NSString stringWithFormat:@"%lu",(unsigned long)index];
UIButton *button = [_badges objectAtIndex:index];
[button setTitle:@"" forState:UIControlStateNormal];
button.hidden=YES;
[pushArray removeObjectForKey:key];
}
在最后的字符串中我收到错误:
* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSDictionaryI removeObjectForKey:]:无法识别的选择器发送到实例 0x145a78a0”
请有人告诉我如何更正它。
最佳答案
它不是一个可变的字典
您应该使用下面的初始化程序来使字典可变。
_pusharray = [NSMutableDictionary dictionaryWithDictionary:[[userInfo valueForKey:@"aps"] valueForKey:@"badges"]];
另外,作为一种风格,不要将字典称为数组
也是个人不喜欢看这个
[(AppDelegate *)[[UIApplication sharedApplication] delegate] pushArray];
如果您需要这种功能,请创建您自己的单例,不要用这种东西让应用程序代理重载。应用委托(delegate)用于系统与您的应用对话,您应该尽可能避免将应用逻辑放在这里。
关于ios - 从 AppDelegate 中的 NSMutableDictionary 清除几个推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21935635/