Ios NSNumber numberWithBool更改plist文件中布尔值

Ios NSNumber numberWithBool更改plist文件中布尔值,ios,objective-c,plist,nsnumber,Ios,Objective C,Plist,Nsnumber,我有一个plist文件,其中一个类型为boolean的键apicall设置为NO。 然后在代码中检索该值,如下所示: NSString *destinationPath= [doumentDirectoryPath stringByAppendingPathComponent:@"DefaultSettings.plist"]; NSMutableDictionary *defaultPreferences = [NSMutableDictionary dictionaryWithContent

我有一个plist文件,其中一个类型为boolean的键apicall设置为NO。 然后在代码中检索该值,如下所示:

NSString *destinationPath= [doumentDirectoryPath stringByAppendingPathComponent:@"DefaultSettings.plist"];
NSMutableDictionary *defaultPreferences = [NSMutableDictionary dictionaryWithContentsOfFile:destinationPath];

NSLog(@"SETUP %@", defaultPreferences);

[[NSUserDefaults standardUserDefaults] registerDefaults:defaultPreferences];
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

NSMutableArray *tmp = [data objectForKey:@"user"];;
user.email = [tmp valueForKey:@"email"];
user.userId = [tmp valueForKey:@"id"];
user.username = [tmp valueForKey:@"username"];
user.APICall = [NSNumber numberWithBool:[defaults objectForKey:@"APICalls"]];

NSLog(@"API Call Value: %@", user.APICall);
我的第一个日志返回:

SETUP {
APICalls = 0;
TrackingTimer = 15;
VoiceMessages = 0;
}

显示ApicCalls的值为0。 但当我登录user.APICall时,我得到

API Call Value: 1
user.APICall也是NSNumber类型。

问题在于objectForKey:of NSUserDefaults返回一个cocoa对象——在本例中,它可能是一个NSNumber。当您将其传递给numberWithBool:method时,它将nil视为NO,其他所有内容都视为YES

如果APICalls设置为布尔值,则可以直接使用它,如下所示:

user.APICall = [defaults objectForKey:@"APICalls"];
如果APICalls是一个要重新解释为布尔值的数字,则可以使用此行:

user.APICall = [NSNumber numberWithBool:[[defaults objectForKey:@"APICalls"] intValue] != 0];

不要忘记调用[userDefaults Synchronize]。

仅仅因为您将默认值注册到特定值,并不意味着它们没有在用户的首选项文件夹中被覆盖。在尝试访问特定的APICalls首选项之前,您是否可以同时记录默认值?或者只需在分配前检查是否为nil这并不能提供问题的答案。若要评论或要求作者澄清,请在他们的帖子下方留下评论。原来是[userDefaults Synchronize],因为作者是我的朋友,它确实解决了他的问题。我假设作者有足够的智力/不是一个需要在每一步都得到指导的孩子,并且可以阅读苹果开发者网站上的同步方法文档。这清楚地解释了该方法的目的,所以我不想重复已经编写的内容,也不想复制这里的文档。