Search code examples
objective-cios4audionsuserdefaultsboolean

save bool in nsuserdefaults


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?


Solution

  • 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;
    }