1

虽然 NSUserDefaults 的代码看起来很简单,但我无法让它工作。

我有一个设置视图,用户可以在其中禁用或不禁用声音。这是我的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.soundSettings.font = [UIFont rw_snapFontWithSize:24.0f];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if([defaults objectForKey:@"stateForSoundSwitch"]) {
        NSLog(@"Sound is ON");
        self.soundStatus.on=YES;
    } else {
        self.soundStatus.on=NO;
        NSLog(@"Sound is OFF");
    }
}

- (IBAction)soundSwitchChanged:(id)sender
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if (self.soundStatus.on) {
        NSLog(@"Sound is enabled");
        [defaults setBool:true forKey:@"stateForSoundSwitch"];
    }
    else {
        NSLog(@"Sound is disabled");
        [defaults setBool:false forKey:@"stateForSoundSwitch"];
    }
    [defaults synchronize];

}

但即使我将开关更改为 FALSE,每次我登录设置屏幕时,值都是 TRUE。我错过了什么?

4

1 回答 1

1

setBool:forKey: 需要一个 BOOL。尝试使用 YES 或 NO 而不是 true 或 false(类型为 bool,小写)。

此外,您应该使用 boolForKey 而不是 objectForKey 来访问它。

如果您曾经在 NSUserDefaults 中设置过对象,您的逻辑测试将始终为 YES,因为您正在有效地测试密钥是否存在(即不为零),而不是它是否实际设置为 YES/NO。

换句话说,改变:

if ([defaults objectForKey:@"stateForSoundSwitch"]) {

对此:

if ([defaults boolForKey:@"stateForSoundSwitch"] == YES) {
于 2013-07-18T22:18:01.543 回答