iPhone:在应用程序被杀死时保留 NSUserDefaults 值
Posted
技术标签:
【中文标题】iPhone:在应用程序被杀死时保留 NSUserDefaults 值【英文标题】:iPhone: preserve NSUserDefaults values when application is killed 【发布时间】:2011-07-05 15:31:53 【问题描述】:我正在尝试使用 NSUserDefaults 实现“添加到收藏夹”功能。到目前为止,我已经编写了以下代码。
- (void)favouriteButtonClicked:(id)sender
favselected = !favselected; // favselected is BOOL property
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
NSString* viewname = @"custom";
if(favselected)
[favButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateNormal];
[appDelegate addTOFavourites:self.ViewID viewType:self.ViewType];
else
[favButton setBackgroundImage:[UIImage imageNamed:@"unselected.png"] forState:UIControlStateNormal];
[appDelegate removeFromFavourites:self.ViewID viewType:self.ViewType];
只要我的应用程序正在运行,它就可以正常工作,但是当我杀死我的应用程序时,我会丢失所有存储的值,因此下次加载视图时,在 viewload 中 isAddedToFavorites 方法返回 false。有没有办法维护我的价值观?我错过了什么吗?
if([appDelegate isAddedToFavorites:self.ViewID])
[favButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateNormal];
favselected = YES;
else
[favButton setBackgroundImage:[UIImage imageNamed:@"unselected.png"] forState:UIControlStateNormal];
favselected = NO;
编辑:
我尝试使用 NSMutableDictionary,因为我必须添加多个键值,但即使在将对象添加到字典之后,以下方法始终显示 Count=0。任何帮助将非常感激。谢谢。
-(BOOL)isAddedToFavorites:(NSString*)viewID
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *favourites = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy];
if(favourites && [[favourites objectForKey:kFavouriteItemsKey] objectForKey:viewID])
return YES;
return NO;
-(void)addToFavourites:(NSString*)viewID viewType:(NSString*)viewType
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *dict = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy];
if(standardUserDefaults)
if(![dict objectForKey:viewID])
[dict setObject:viewType forKey:viewID]; // It is coming here but still count zero!
NSLog(@"count = %d", [dict count]);
[standardUserDefaults setObject:dict forKey:kFavouriteItemsKey]; // Always dict remains null with 0 objects in it
[standardUserDefaults synchronize];
[dict release];
-(void)removeFromFavourites:(NSString*)viewID viewType:(NSString*)viewType
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *dict = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy];
if(standardUserDefaults)
if ([dict objectForKey:viewID])
[dict removeObjectForKey:viewID];
[standardUserDefaults setObject:dict forKey:kFavouriteItemsKey];
[standardUserDefaults synchronize];
[dict release];
谢谢。
【问题讨论】:
尝试注销您发布的代码中的所有内容。 另外,你有没有在某处初始化你的收藏夹数组? 注销所有内容是什么意思?我尝试更改 kFavoriteItemsKey 但没有运气。我已经用现有数据初始化字典对象。如果数据不可用,它将设置为 null,但我仍然会进行单独的初始化并查看它是否有任何区别。 使用 NSLog 语句将所有值记录到控制台。 我已经做到了! ViewID 和 ViewType 在通过时是正确的。 [dict setObject...] 也被执行,但在 dict 之后仍然保留 0 个对象! 【参考方案1】:NSUserDefaults 实际上是用来永久存储值的,事实上,如果您为程序创建任何设置,它们将被保存为 NSUserDefaults。
我认为问题在于您没有使用您正在检索的相同密钥保存它。尝试像这样保存:
//To save
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:appDefaults forKey:kFavouriteItemsKey];
[[NSUserDefaults standardUserDefaults] synchronize];
//To retrieve
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *favourites = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy];
字典试试:
NSDictionary *myDictionary= [[NSUserDefaults standardUserDefaults] objectForKey:kFavouriteItemsKey];
// Create a mutable dictionary to replace the old immutable dictionary
NSMutableDictionary *myMutableDictionary= [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]+1];
// transfer the old dictionary into the new dictionary
[myMutableDictionaryaddEntriesFromDictionary:myDictionary];
// Now add the data
[myMutableDictionary setObject:myObject forKey:myKey];
【讨论】:
你是对的。这是我的错。我以前使用相同的键存储了一些无效的 NSData 值,这就是造成问题的原因。我已经更改了密钥名称并且它有效!谢谢!顺便说一句,这个值在 iPhone 上存储在哪里?如何在不参考我的应用程序的情况下删除它们?另外,您是否看到另一个问题,为什么我的计数器总是归零?它仍在发生。我无法存储多个键值。基本上我将当前默认值放入可变字典中,修改它们并将修改后的字典设置为默认值,但似乎不起作用! @AppleDeveloper 该值存储在您的应用程序“沙盒”中,因此它始终专门指您的应用程序,但是您可以只使用 [[NSUserDefaults standardUserDefaults] removeObjectForKey:myKey];删除任何你想要的NSUserDefaults,我不确定我是否看到了这个问题,你能把链接放上来吗?我可以看看。 您好 OscarMK,我已经编辑了我的问题,并添加了 cmets,这对您理解问题很有用。很久以来我一直在挠头。看不懂怎么回事!!任何帮助将不胜感激。谢谢。 @AppleDeveloper NSUserDefaults 总是返回不可变对象,我知道您正在发送 mutableCopy 消息,但由于某种原因它不能那样工作,您可以尝试我刚刚在我的答案中编辑的内容。 你是对的。我必须按照你的建议做,但最后一个问题是它无法与 NSUserDefaults 同步!我在您的答案中添加了最后三行。知道为什么它没有被存储吗?会不会是因为this?我尝试将字典转换为 NSData 但对我来说看起来很奇怪。无法再次获得密钥!以上是关于iPhone:在应用程序被杀死时保留 NSUserDefaults 值的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序被杀死(非活动)时,点击 Firebase 通知不起作用