ios : Mute Button doesn't work after application enters foreground - ios

I've created a button that stops and plays background music when clicked. It works great, but when I click on the home button, and relaunch the application (background - foreground) the button doesn't work. I click on it and it does nothing. Help please!! Thanks
This is the code:
- (IBAction)muteButtonPressed:(id)sender {
UIImage *currentImage = [self.muteButton currentImage];
UIImage *vol1 = [UIImage imageNamed:#"Volume 1"];
UIImage *vol2 = [UIImage imageNamed:#"Volume 2"];
if ([currentImage isEqual:vol1]) {
[self.muteButton setImage:vol2 forState:UIControlStateNormal];
[self.backgroundMusic stop];
self.scene.playSounds = NO;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:0 forKey:#"playSounds"];
[defaults synchronize];
}
if ([currentImage isEqual:vol2]) {
[self.muteButton setImage:vol1 forState:UIControlStateNormal];
[self playBackground];
self.scene.playSounds = YES;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:1 forKey:#"playSounds"];
[defaults synchronize];
}
}
and this is the code in the viewcontroller :
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *playSoundsString = [defaults objectForKey:#"playSounds"];
NSInteger playSoundsInt = [playSoundsString intValue];
NSNumber *playSoundsNumber = [NSNumber numberWithInteger:playSoundsInt];
self.scene.playSounds = [playSoundsNumber boolValue];
if (self.scene.playSounds == YES) {
UIImage *vol1 = [UIImage imageNamed:#"Volume 1"];
self.scene.playSounds = YES;
[self playBackground];
[self.muteButton setImage:vol1 forState:UIControlStateNormal];
}
else if (self.scene.playSounds == NO) {
UIImage *vol2 = [UIImage imageNamed:#"Volume 2"];
self.scene.playSounds = NO;
[self.muteButton setImage:vol2 forState:UIControlStateNormal];
}
finally this is when my app enters background (in viewcontroller) :
if (self.scene.playSounds == YES) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:#selector(stopMusic:) name:#"SOUND_OFF" object:nil];
}

Related

how to hide Outlet in Xcode and save it from never appearing again?

I want to hide a outlet that is also a button after the action is made, then I need it to be saved so it doesn't appear again.
Ive used in the cation
- (IBAction)giveheart:(id)sender {
[_heartM setHidden:YES];
nLife = [lblLife.text intValue]+1;
[savedStock setObject:[NSNumber numberWithFloat:nLife] forKey:#"life"];
[savedStock writeToFile: path atomically:YES];
}
Now I need to save it to not appear again even when the app is turned off and on again.
How is that done, and what should I do?
Save the state in the NSUserDefaults when button pressed.
- (IBAction)giveheart:(id)sender {
//Save the state in NSUserDefaults here
[[NSUserDefaults standardUserDefaults]setObject:#"Yes" forKey:#"hide"];
[[NSUserDefaults standardUserDefaults]synchronize];
[_heartM setHidden:YES];
nLife = [lblLife.text intValue]+1;
[savedStock setObject:[NSNumber numberWithFloat:nLife] forKey:#"life"];
[savedStock writeToFile: path atomically:YES];
}
in ViewDidLoad method of the viewcontroller
NSString *status = [[NSUserDefaults standardUserDefaults]objectForKey:#"hide"];
if(status != nil && [status isEqualToString:#"Yes"] )
[_heartM setHidden:YES];
You can save the state of the button to NSUserDefaults as follows.
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:[NSNumber numberWithBool:_heartM.isHidden] forKey:#"buttonState"];
[userDefaults synchronize];
When you view is loaded, you can get the status of button from the defaults
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSNumber *boolNum = [userDefaults objectForKey:#"buttonState"];
if(boolNum) {
_heartM.hidden = [boolNum boolValue];
}

How to use UISwitch with NSUserDefault

defaults = [NSUserDefaults standardUserDefaults];
NSLog(#"%#",[defaults objectForKey:#"firsttime"])
if([[defaults objectForKey:#"firsttime"]isEqualToString:#"YES"])
{
UISwitch *onoff = (UISwitch *) sender;
if(onoff.on)
{
NSLog(#"yes on1 facebookswitch");
facebookSwitch.on = YES;
[userDefault setValue:#"true" forKey:#"facebooknotify"];
NSLog(#"on");
if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
[validate alertCommonWithoutMessage:NSLocalizedString(#"val_message",nil) :NSLocalizedString(#"val_facebook_login",nil) :#"OK"];
facebookSwitch.on = YES;
NSLog(#"yes on2 facebookswitch");
}
else {
NSLog(#"val_facebook_conf");
[validate alertCommonWithoutMessage:NSLocalizedString(#"val_message",nil) :NSLocalizedString(#"val_facebook_conf",nil) :#"OK"];
facebookSwitch.on = NO;
[userDefault setValue:#"false" forKey:#"facebooknotify"];
NSLog(#"yes off1 facebookswitch");
I'm using this method,but sumtimes the response is null.
Try this code:
// add this code in your switch touch event
- (IBAction)YourSwitch:(UISwitch*)sender
{
if (UISwitch.on)
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:true forKey:#"Sound"];
[defaults synchronize];
}
else
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:false forKey:#"Sound"];
[defaults synchronize];
}
}
// add this code in your viewDidload .
BOOL isSound= [[NSUserDefaults standardUserDefaults] objectForKey:#"Sound"];
if (isSound){
_ref_slider.on=TRUE;
} else {
_ref_slider.on=FALSE;
}
i hope this code is useful for you.
As to why it's not working, the most common problem is [userDefault synchronize]
Also, rather than using string boolean values, why not use:
[userDefault setBool:YES forKey:#"facebooknotify"];
and then access by
BOOL notified = [userDefault boolForKey:#"facebooknotify"];

display data based on uiswitch state

I am trying to display data based on if the user has selected a switch. the user will have he ability to select either one or two switches to either both on or one or other on. Data will then be displayed according to the state of the switch.
I have managed to get this to load however its only displaying data from the dare array in the plist file and it dosnt matter which state the switch is in it displays dare not truth or both.
- (IBAction)shownext:(id)sender {
if (!self.plistArray) {
NSString *path = [[NSBundle mainBundle] pathForResource:
#"data" ofType:#"plist"];
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
if ([[defaults objectForKey:#"truthonoff"] isEqualToString:#"YES"] && [[defaults objectForKey:#"dareonoff"] isEqualToString:#"YES"] ) {
NSDictionary *plistDict1 = [[NSDictionary alloc] initWithContentsOfFile:path];
NSArray * plistArray1 = plistDict1[#"truth"];
NSDictionary *plistDict2 = [[NSDictionary alloc] initWithContentsOfFile:path];
NSArray *plistArray2 = plistDict2[#"dare"];
self.plistArray = [[plistArray1 arrayByAddingObjectsFromArray:plistArray2] mutableCopy];
} else if ([[defaults objectForKey:#"truthonoff"] isEqualToString:#"YES"] ) {
NSDictionary *plistDict3 = [[NSDictionary alloc] initWithContentsOfFile:path];
NSArray *plistArray3 = plistDict3[#"truth"] ;
self.plistArray = [plistArray3 mutableCopy];
NSLog(#"%#", plistArray);
} else ([[defaults objectForKey:#"dareonoff"] isEqualToString:#"YES"] ); {
NSDictionary *plistDict4 = [[NSDictionary alloc] initWithContentsOfFile:path];
NSMutableArray *plistArray4 = plistDict4[#"dare"];
self.plistArray = [plistArray4 mutableCopy];
NSLog(#"%#", plistArray);
}
}
}
-(void)stateSwitched:(id)sender {
UISwitch *tswitch = (UISwitch *)sender;
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
[defaults setObject: tswitch.isOn ? #"YES" : #"NO" forKey:#"truthonoff"];
[defaults synchronize];
}
-(void)stateSwitcheddare:(id)sender {
UISwitch *tswitch = (UISwitch *)sender;
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
[defaults setObject: tswitch.isOn ? #"YES" : #"NO" forKey:#"dareonoff"];
[defaults synchronize];
}
THis is my code for setting the object
Try to use boolForKey instead of objectForKey. And in the other hand, why does the else have a condition?:
if ([defaults boolForKey:#"truthonoff"] && [defaults boolForKey:#"dareonoff"]) {
// Both true
} else if ([defaults boolForKey:#"truthonoff"] && ![defaults boolForKey:#"dareonoff"]) {
// truthonoff true, dareonoff false
} else if (![defaults boolForKey:#"truthonoff"] && [defaults boolForKey:#"dareonoff"]) {
// truthonoff false, dareonoff true
} else {
// Both false
}
Make sure to do two things when you store boolean values in the NSUserStandardDefaults:
Use setBool setter: [[NSUserDefaults standardUserDefaults] setBool:YES forKey:#"a_key"];
Remember to synchronize the standardUserDefaults to save the values.

Load data from NSUserDefaults in ViewDidLoad

In the start screen of my app you are able to choose language between English and Swedish by clicking on either the flag of UK or Sweden.
The problem is that the ViewDidLoad does not recognize changes in the NSUserDefaults when you click a button. But when you restart the app, the language is the latest flag you clicked! So it saves the NSUserDefault but it only loads it the first time in ViewDidLoad..
When you click the English flag, sprakval sets to 0, and if you click the swedish flag, sprakval sets to 1. When you click a flag, it changes to a image with a tick icon in front of the flag.
Code:
-(IBAction) sprakEN
{
sprakval=0;
NSUserDefaults *sprakvalet = [NSUserDefaults standardUserDefaults];
[sprakvalet setInteger:sprakval forKey:#"Sprak "];
[sprakvalet synchronize];
[super viewDidLoad];
}
-(IBAction) sprakSE
{
sprakval=1;
NSUserDefaults *sprakvalet = [NSUserDefaults standardUserDefaults];
[sprakvalet setInteger:sprakval forKey:#"Sprak "];
[sprakvalet synchronize];
[super viewDidLoad];
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSUserDefaults *sprakvalet = [NSUserDefaults standardUserDefaults];
sprakval2 = [sprakvalet integerForKey:#"Sprak "];
if (sprakval2==0)
{
spraklabel.text = [NSString stringWithFormat:#"Language:"];
[lhb setTitle:#"english" forState:UIControlStateNormal];
[hlb setTitle:#"english" forState:UIControlStateNormal];
[fhb setTitle:#"english." forState:UIControlStateNormal];
[blandatb setTitle:#"english.." forState:UIControlStateNormal];
UIImage *encheck = [UIImage imageNamed:#"United_Kingdomchecked.png"];
[enbutton setImage:encheck forState:UIControlStateNormal];
UIImage *seuncheck = [UIImage imageNamed:#"Sweden.png"];
[sebutton setImage:seuncheck forState:UIControlStateNormal];
self.title = #"Game";
}
else if(sprakval2==1)
{
spraklabel.text = [NSString stringWithFormat:#"Språk:"];
[lhb setTitle:#"swedish" forState:UIControlStateNormal];
[hlb setTitle:#"swedish" forState:UIControlStateNormal];
[flb setTitle:#"swedish" forState:UIControlStateNormal];
[fhb setTitle:#"swedish" forState:UIControlStateNormal];
[blandatb setTitle:#"swedish" forState:UIControlStateNormal];
self.title = #"Spel";
UIImage *secheck = [UIImage imageNamed:#"Swedenchecked.png"];
[sebutton setImage:secheck forState:UIControlStateNormal];
UIImage *enuncheck = [UIImage imageNamed:#"United_Kingdom.png"];
[enbutton setImage:enuncheck forState:UIControlStateNormal];
}
// Do any additional setup after loading the view, typically from a nib.
}
This is because you are calling ViewDidload method through its super class in -(IBAction) sprakSE
and -(IBAction) sprakEN
methods. So replace
[super viewDidLoad]; with
[self viewDidLoad]; in both methods. It will work properly.
Hope it helps you.
viewDidLoad is a method invoked after view has been loaded from nib file. You are not supposed to call it manually.
If you have written the code to refresh the controls in viewDidLoad move that into a different method and invoke that method from your button event handler.
- (void)adjustControlsForLanguage
{
NSUserDefaults *sprakvalet = [NSUserDefaults standardUserDefaults];
sprakval2 = [sprakvalet integerForKey:#"Sprak "];
if (sprakval2==0)
{
spraklabel.text = [NSString stringWithFormat:#"Language:"];
[lhb setTitle:#"english" forState:UIControlStateNormal];
[hlb setTitle:#"english" forState:UIControlStateNormal];
[fhb setTitle:#"english." forState:UIControlStateNormal];
[blandatb setTitle:#"english.." forState:UIControlStateNormal];
UIImage *encheck = [UIImage imageNamed:#"United_Kingdomchecked.png"];
[enbutton setImage:encheck forState:UIControlStateNormal];
UIImage *seuncheck = [UIImage imageNamed:#"Sweden.png"];
[sebutton setImage:seuncheck forState:UIControlStateNormal];
self.title = #"Game";
}
else if(sprakval2==1)
{
spraklabel.text = [NSString stringWithFormat:#"Språk:"];
[lhb setTitle:#"swedish" forState:UIControlStateNormal];
[hlb setTitle:#"swedish" forState:UIControlStateNormal];
[flb setTitle:#"swedish" forState:UIControlStateNormal];
[fhb setTitle:#"swedish" forState:UIControlStateNormal];
[blandatb setTitle:#"swedish" forState:UIControlStateNormal];
self.title = #"Spel";
UIImage *secheck = [UIImage imageNamed:#"Swedenchecked.png"];
[sebutton setImage:secheck forState:UIControlStateNormal];
UIImage *enuncheck = [UIImage imageNamed:#"United_Kingdom.png"];
[enbutton setImage:enuncheck forState:UIControlStateNormal];
}
}
viewDidLoad
- (void)viewDidLoad{
[super viewDidLoad];
[self adjustControlsForLanguage];
}
Button Event Handlers
-(IBAction) sprakEN {
sprakval=0;
NSUserDefaults *sprakvalet = [NSUserDefaults standardUserDefaults];
[sprakvalet setInteger:sprakval forKey:#"Sprak "];
[sprakvalet synchronize];
[self adjustControlsForLanguage];
}
-(IBAction) sprakSE {
sprakval=1;
NSUserDefaults *sprakvalet = [NSUserDefaults standardUserDefaults];
[sprakvalet setInteger:sprakval forKey:#"Sprak "];
[sprakvalet synchronize];
[self adjustControlsForLanguage];
}
EDIT : Since you are using tabBar based app, it's better to use the viewWillAppear to reload the language specific controls
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self adjustControlsForLanguage];
}
- (void)viewDidLoad
{
[super viewDidLoad];
}

Can not get color from NSUserDefaults at first app launch

I have a big problem and could not solve it for few days already.
When app loads at first time, I'm saving 4 colors to NSUserDeafaults in first UIViewController.
ViewController.m
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSUserDefaults *sharedDefaults = [NSUserDefaults standardUserDefaults];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSInteger countValue = [defaults integerForKey:#"Array"];
if ([sharedDefaults boolForKey:#"FirstLaunch"])
{
[self openSubView];
[sharedDefaults setBool:NO forKey:#"FirstLaunch"];
[sharedDefaults synchronize];
[self saveColorsToDefaults];
// [prefs synchronize];
} // Do any additional setup after loading the view.
else if(countValue == 1)
{
}
}
-(void)saveColorsToDefaults{
const CGFloat *components1 = CGColorGetComponents([UIColor darkGrayColor].CGColor);
const CGFloat *components2 = CGColorGetComponents([UIColor blueColor].CGColor);
const CGFloat *components3 = CGColorGetComponents([UIColor redColor].CGColor);
const CGFloat *components4 = CGColorGetComponents([UIColor purpleColor].CGColor);
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setFloat:components1[0] forKey:#"cr"];
[prefs setFloat:components1[1] forKey:#"cg"];
[prefs setFloat:components1[2] forKey:#"cb"];
[prefs setFloat:components1[3] forKey:#"ca"];
[prefs setFloat:components2[0] forKey:#"cr2"];
[prefs setFloat:components2[1] forKey:#"cg2"];
[prefs setFloat:components2[2] forKey:#"cb2"];
[prefs setFloat:components2[3] forKey:#"ca2"];
[prefs setFloat:components3[0] forKey:#"cr3"];
[prefs setFloat:components3[1] forKey:#"cg3"];
[prefs setFloat:components3[2] forKey:#"cb3"];
[prefs setFloat:components3[3] forKey:#"ca3"];
[prefs setFloat:components4[0] forKey:#"cr4"];
[prefs setFloat:components4[1] forKey:#"cg4"];
[prefs setFloat:components4[2] forKey:#"cb4"];
[prefs setFloat:components4[3] forKey:#"ca4"];
[prefs synchronize];
NSLog(#"I just saved colors");
}
And after I need to set these colors to `DrawViewControllers drawing instruments.
I can get only last 3 colors but 1st color does not apears.
But when I set color for 1st instrument via colorPicker and save all the colors again to NSUserDefaults it works great!
-(void)LoadColorsAtStart
{
NSUserDefaults *prefers = [NSUserDefaults standardUserDefaults];
UIColor* tColor = [UIColor colorWithRed:[prefers floatForKey:#"cr"] green:[prefers floatForKey:#"cg"] blue:[prefers floatForKey:#"cb"] alpha:[prefers floatForKey:#"ca"]];
UIColor* tColor2 = [UIColor colorWithRed:[prefers floatForKey:#"cr2"] green:[prefers floatForKey:#"cg2"] blue:[prefers floatForKey:#"cb2"] alpha:[prefers floatForKey:#"ca2"]];
UIColor* tColor3 = [UIColor colorWithRed:[prefers floatForKey:#"cr3"] green:[prefers floatForKey:#"cg3"] blue:[prefers floatForKey:#"cb3"] alpha:[prefers floatForKey:#"ca3"]];
UIColor* tColor4 = [UIColor colorWithRed:[prefers floatForKey:#"cr4"] green:[prefers floatForKey:#"cg4"] blue:[prefers floatForKey:#"cb4"] alpha:[prefers floatForKey:#"ca4"]];
[prefers synchronize];
[self extractRGBforBlack:tColor];
[self extractRGBforBlue:tColor2];
[self extractRGBforRed:tColor3];
[self extractRGBforLine:tColor4];
[self.colorBar1 setTextColor:self.blackExtract];
[self.colorBar2 setTextColor:self.blueExtract];
[self.colorBar3 setTextColor:self.redExtract];
[self.colorBar4 setTextColor:self.lineExtract];
NSLog(#"I have extracted colors");
}
I have 5 similar DrawViewControllers and all works with Drawing UIView.
1.Store UIColor as nsdata into nsuserdefaults
NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];
2.Retrive UIColor from viewdidload
UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
Try this it will work without error
1.Store UIColor as NSString into NSUserDefaults
-(void)storeColor
{
NSString *colString = [NSString stringWithFormat:#"%#", [UIColor whiteColor]];
[[NSUserDefaults standardUserDefaults] setObject:colString forKey:#"keyFontColor"];
}
2.Convert string into UIColor while retrieve
-(void)retriveColor
NSArray *values = [[[NSUserDefaults standardUserDefaults] objectForKey:#"keyFontColor"] componentsSeparatedByString:#" "];
NSLog(#"%d",[values count]);
UIColor *def_color = [[UIColor alloc] init];
if ([values count]==5) {
CGFloat red = [[values objectAtIndex:1] floatValue];
CGFloat green = [[values objectAtIndex:2] floatValue];
CGFloat blue = [[values objectAtIndex:3] floatValue];
CGFloat alpha = [[values objectAtIndex:4] floatValue];
def_color = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
self.dateLabel.textColor = def_color;
}
else if ([values count]==3)
{
CGFloat white = [[values objectAtIndex:1] floatValue];
CGFloat alpha = [[values objectAtIndex:2] floatValue];
def_color = [UIColor colorWithWhite:white alpha:alpha];
self.label.textColor = def_color;
}
else
{
// its store default value while app loads first time
self.label.textColor.textColor = [UIColor blackColor];
}
}

Resources