save bool in nsuserdefaults
Solution 1
No need to wrap it in an NSNumber, there are some convenience methods for this:
To set a BOOL, use:
[userDefaults setBool:YESorNO forKey:@"yourKey"];
To access it, use:
[userDefaults boolForKey:@"yourKey"];
[EDIT TO ANSWER YOUR ADDITIONAL QUESTION]
Not sure why you are using NSUserDefaults - it seems unnecessary for what you are trying to achieve? Here's what I would do for a button that can start/stop music:
-(IBAction)check
{
if (isQuiet)
{
// Play music
// Change the button to indicate it is playing...
} else
{
// Stop music
// Change the button to indicate it has stopped...
}
// Set your isQuiet to be the opposite of what it was when the button was clicked
isQuiet = !isQuiet;
}
Solution 2
Box your BOOL value to NSNumber object and add it to NSUserDefault:
NSUserDefaults *boolUserDefaults = [NSUserDefaults standardUserDefaults];
[boolUserDefaults setObject:[NSNumber numberWithBool:isquiet]
forKey:@"stringKey"];
Later you'll be able to retrieve that value as plain BOOL using -boolForKey:
function in NSUserDefaults
Solution 3
To save:
[boolUserDefaults setObject:[NSNUmber numberWithBool:isQuiet] forKey:@"stringKey"];
When you read it back, read it as a NSNumber then do:
BOOL savedIsQuiet = [theNumberYouSaved boolValue];
Solution 4
Swift:
To save bool:
UserDefaults.standard.set(true, forKey: "storageKey")
To retrieve the bool:
let boolValue = UserDefaults.standard.bool(forKey: "storageKey")
Related videos on Youtube
Leon
Updated on June 04, 2022Comments
-
Leon almost 2 years
when my app starts music is playing:
-(void)playBgMusic { NSString *path = [[NSBundle mainBundle] pathForResource:@"bgmusic" ofType:@"aif"]; theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; theAudio.delegate = self; [theAudio play]; }
but he should be able to turn the music off by pressing a button if he presses the button again the music should turn on again. i have:
-(IBAction)check { if (isquiet == NO) { [theAudio stop]; isquiet = YES; defaults = [NSUserDefaults standardUserDefaults]; [defaults setBool:YES forKey:@"stringKey"]; } else { [self playBgMusic]; isquiet = NO; defaults = [NSUserDefaults standardUserDefaults]; [defaults setBool:NO forKey:@"stringKey"]; } }
I think I didn't get it. Now it works in my first ViewController that I can turn the music on and off but when I go to another viewController while the music is playing, then back again and press the button, the music doesn't stop and when i press it many times the music is played a second time and overlaps.
What's still wrong?
-
Rog about 13 yearsthere's also a
setBool
function so wrapping it in a NSNumber is unnecessary :) -
Leon about 13 yearssaving works but now there's still a problem, i edited my question
-
Rog about 13 yearsThat's a different question but I've edited my answer, see if it helps. It doesn't look like you need to use NSUserDefaults at all.
-
Leon about 13 yearsi explained the necessity in my question before i edited it, sorry for deleting it. I have different viewcontrollers. For expample the app starts, the music is playing and I go to another viewcontroller and back again. in this case the bool is still no. so when I press the button at this time the music would start a second time and overlaps. you understand?
-
Leon about 13 yearsthank you, I marked your answer as right and asked another question here: stackoverflow.com/questions/5588209/bool-saving-problem than maybe you could take a look at it, would be nice, thanks.
-
Viktor almost 8 yearsFor accept changes you need use
[userDefaults synchronize];
after setting value