0

loadTheme我对以下代码有一些问题,即使在 userDefaults 中找不到任何内容,变量似乎也永远不会为空:

NSString *loadTheme = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"theme"]];

if (!loadTheme){
    NSLog(@"No theme set");
    loadTheme =  @"Default";
}

如果存储中没有任何内容,我如何正确确保 if 子句运行(用户默认值)

4

3 回答 3

1

根据文档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" */
于 2013-06-25T15:38:45.777 回答
0

你可以这样做。

NSString *loadTheme = [NSUserDefaults standardUserDefaults] stringForKey:@"theme"];
if (loadTheme.length == 0) {
    NSLog(@"No theme set");
    loadTheme =  @"Default";
}

当您通过 stringWithFormat: 方法生成 NSString 时,它永远不会是nil. 通过使用字符串的长度,您可以从其他字符串中分辨出所有 @"" 和 nil(如果您还没有设置值)。请注意确保将 NSString 保存到用户默认键。如果你不能得到一个 NSString 或 nil,你可能会得到一个无法识别的选择器错误。

于 2013-06-25T15:39:34.600 回答
0

我发现这是iPhone SDK上 NSUserDefaults 的一部分,没有返回 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:

于 2013-06-25T15:43:06.133 回答