我在使用以下代码时遇到一些问题,即使在userDefaults中找不到任何内容,loadTheme
变量似乎也不会为null:
NSString *loadTheme = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"theme"]];
if (!loadTheme){
NSLog(@"No theme set");
loadTheme = @"Default";
}
如果存储中没有任何内容(userdefaults)
,如何正确确保if子句运行?答案 0 :(得分:1)
根据documentation,如果密钥不存在,则返回nil
。您应该将过程构造为:
NSString *theme = [[NSUserDefaults standardUserDefaults] stringForKey:@"theme"];
if (theme == nil) {
/* No theme, probably throw an error, return, and/or use a default value */
}
/* Theme is there, do whatever with "theme" */
答案 1 :(得分:0)
你可以这样做。
NSString *loadTheme = [NSUserDefaults standardUserDefaults] stringForKey:@"theme"];
if (loadTheme.length == 0) {
NSLog(@"No theme set");
loadTheme = @"Default";
}
当你通过stringWithFormat:方法生成NSString时,它永远不会是nil
。通过使用字符串的长度,您可以告诉所有@“”和nil(如果尚未设置值)来自其他字符串。请务必确保将NSString保存到用户默认密钥。如果无法获得NSString或nil,则可能会出现无法识别的选择器错误。
答案 2 :(得分:0)
我发现这是NSUserDefaults on iPhone SDK not returning nil
的一部分从新的iPhone项目测试:
if (![[NSUserDefaults standardUserDefaults] valueForKey:@"foobar"]) NSLog(@"is not yet defined");
if (![[NSUserDefaults standardUserDefaults] objectForKey:@"foobar"]) NSLog(@"is not yet defined");
if ([[NSUserDefaults standardUserDefaults] valueForKey:@"foobar"] == nil) NSLog(@"valueForKey is nil");
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"foobar"] == nil) NSLog(@"objectForKey is nil");
输出:
is not yet defined
is not yet defined
valueForKey is nil
objectForKey is nil
所以从上面你必须得到解决方案。
另外,
NSString *loadTheme = [[NSUserDefaults standardUserDefaults] valueForKey:@"theme"];
就足够了,不需要使用stringWithFormat: