虽然NSUserDefaults的代码看起来很简单,但我无法使其正常工作。
我有一个settingViews,用户可以在其中禁用声音。这是我的代码:
- (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。我错过了什么?
答案 0 :(得分:1)
setBool:forKey:期望一个BOOL。尝试使用YES或NO而不是true或false(类型为bool,小写)。
此外,您应该使用boolForKey而不是objectForKey来访问它。
如果您曾在NSUserDefaults中设置对象,那么您的逻辑测试将始终为YES,因为您正在有效地测试密钥是否存在(即不是nil),而不是它是否实际设置为YES / NO。
换句话说,改变:
if ([defaults objectForKey:@"stateForSoundSwitch"]) {
到此:
if ([defaults boolForKey:@"stateForSoundSwitch"] == YES) {