NSUserDefaults:当valueForKey是枚举类型时如何显示用户默认值

3
在iPhone应用程序中,当valueforKey是ENUM时,如何在控制台中显示用户默认值?
当前使用以下代码尝试在控制台中显示时,会崩溃且没有崩溃日志在控制台中。
NSLog(@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:Enum]);
4个回答

5
获取数据:
int someValue = [[NSUserDefaults standardDefaults] integerForKey:@"your key here"];

保存:

[[NSUserDefaults standardDefaults] setInteger:10 forKey:@"your key here"];

编辑:明白了,你崩溃的原因是在 NSLog 中使用了错误的格式:
NSLog(@"%i",[[NSUserDefaults standardUserDefaults] valueForKey:Enum]);

尝试使用%i(用于打印整数)而不是%@(用于打印有效的Objective-C对象)


这不是我想要的。我已经编辑了我的问题。请查看一下。 - Parth Bhatt

4

由于enum实际上只是一种显示int的高级方式,所以您只需创建一个enum变量并将其设置为从NSUserDefaults获取的值即可。

您可能会得到类似以下的内容:

PirateEnumType pirateType = [[NSUserDefaults standardUserDefaults] integerForKey:@"PirateType"];

编辑:

对不起,我想我没有完全理解你的问题。因为枚举实际上是一个整数,所以您需要使用"%i"来显示它,而不是"%@"。

为了将其正确显示为人类可读的字符串,您需要有某种enumToString函数,例如:

-(NSString*)enumToString:(PirateEnumType)enumValue {
    NSString* returnValue = @"";

    switch (enumValue) {
        case Captain:
            returnValue = @"Captain";
            break;
        case Swashbuckler:
            returnValue = @"Swashbuckler";
            break;
        case PegLeg:
            returnValue = @"PegLeg";
            break;
    }

    return returnValue;
}

这不是我想要的。我已经编辑了我的问题,请查看一下。 - Parth Bhatt

0

这里有两个问题。首先,枚举不能作为 valueForKey 中的键。valueForKey 只能接受字符串,而不是枚举的字符串值。因此,您需要实现一个从枚举获取字符串值的方法。在下面的示例中,该方法是 stringFromEnum。这里是如何从枚举获取字符串的一个示例

有时我发现当我要求 NSLog 直接包含发送给对象的消息的返回值时,它会出错。我一直发现将该消息的结果分配给一个实例变量,然后将该实例变量的值传递到 NSLog 中解决了问题,但我承认我还没有弄清楚确定它何时可以或不可以按原来的方式工作的相关因素。欢迎任何评论。

NSString *myKey = [self stringFromEnum:Enum];
NSString *myStringToLog = [[NSUserDefaults standardUserDefaults] valueForKey:myKey];
NSLog(@"%@", myStringToLog);

另一种理解你的问题的方式是,你的实例变量Enum实际上是一个字符串,它是一个枚举的Key,将从NSUserDefaults返回该枚举。然而,这不可能是真的,因为NSUserDefaults不会存储枚举。请参阅文档以获取支持的对象类型。如果这是你要尝试做的事情,你的问题可能部分在于其他代码中,你首先尝试存储枚举的地方?

0

NSUserDefaults 对象实际上只是 NSDictionary 对象。 NSDictionary 只接受对象作为键。枚举只是一个整数,因此不能直接将其用作键。不过,一种方法是使用 NSNumber,它可以将整数表示为对象,如下所示:

[[NSUserDefaults standardDefults] valueForKey:[NSNumber numberWithInt:yourEnum];

要设置值,你需要做以下操作:

[[NSUserDefaults standardDefaults] setValue:yourValue forKey:[NSNumber numberWithInt:yourEnum]];

@CharlieMezak:这不是我想要的。我已经编辑了我的问题,请查看一下。 - Parth Bhatt
@CharlieMezak:感谢您的建议。在我的情况下,代码正在使用枚举常量作为键的值来访问NSUserDefaults。这就是我遇到崩溃的地方。有什么解决方法吗? - Parth Bhatt
你能把导致程序崩溃的代码行发在问题描述里吗?(作为对问题的编辑) - CharlieMezak
这是导致崩溃的代码行 NSLog(@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:Enum]); 你能帮忙吗? - Parth Bhatt
我认为我已经在我的答案中解决了这个问题。你不能使用枚举作为键。枚举是一个整数,而不是一个对象。这个枚举变量在哪里声明的?你能把那段代码发出来吗? - CharlieMezak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接