Here I can use NSUserDefaults, but I need to remove this NSUserDefaults.
In my app I'm using NSUserDefaults for getting locations one View to anotherView but here issue when I'm closed to the my app, and again I started still the locations are there, here I used for removing locations in AppDeligate
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[NSUserDefaults standardUserDefaults]removeObjectForKey:#"Location"];
}
But still locations is there.
How can I removed this?
Can you suggest me.
change your method
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[NSUserDefaults standardUserDefaults]removeObjectForKey:#"Location"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
into
- (void)applicationWillTerminate:(UIApplication *)application
{
[[NSUserDefaults standardUserDefaults]removeObjectForKey:#"Location"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
whenever you remove or add values in NSUserDefaults don't forget to call [[NSUserDefaults standardUserDefaults] synchronize];, if your fetching the values on that time no need to add [[NSUserDefaults standardUserDefaults] synchronize];
Related
I want to open a ViewController only once when the app start for the very first time. Below is my code. The problem is when I am writing YES to NSUserdefaults , doing a synchronise , and then closing the app. in Xcode using simulator , the value is not updated to Yes.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if ([[NSUserDefaults standardUserDefaults] boolForKey:#"isFirstLaunch"])
{
// app already launched
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO],#"isFirstLaunch", nil]];
[[NSUserDefaults standardUserDefaults]synchronize];
}
else
{
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],#"isFirstLaunch", nil]];
[[NSUserDefaults standardUserDefaults]synchronize];
}
return YES;
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if ([[NSUserDefaults standardUserDefaults] boolForKey:#"isFirstLaunch"])
{
NSLog(#"first time");
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:#"Main" bundle:nil];
LASplashUserSettingViewController *splash = [storyboard instantiateViewControllerWithIdentifier:#"splash"];
[self.window.rootViewController presentViewController:splash animated:NO completion:nil];//
}
}
Why is NSUserDefaults not saving my values?
Have followed above and many other links. what am i missing here?
Thanks,
what am i missing here?
-registerDefaults: doesn't do what you think it does. Use -setBool:forKey: instead.
-registerDefaults: is used to ensure that values exist for certain keys in the defaults system. There's no need to call -synchronize after that method because the values in the registration domain are never saved. You probably meant to use that method to set up the default value YES for isFirstLaunch, but your code checks the value for the key before you register the default value! which defeats the purpose of the method. Proper use would be to call -registerDefaults: first, and then check the value associated with the key, and if the value is YES then call -setBool:forKey: to save the value NO.
A simpler option to detect the first launch would be to invert the question. Skip the -registerDefaults: call altogether and change the key to appHasRunPreviously. If no value is stored for a given key, -boolForKey: will return NO. If that happens, you know that this is the first time the app is running, and you should save YES for that key using -setBool:forKey:.
This is how you use NSUserDefaults in AppDelegate.m
+ (void)initialize
{
// Register defaults for first time
NSMutableDictionary *defs = [NSMutableDictionary dictionary];
[defs setObject:[NSNumber numberWithBool:YES] forKey:#"isFirstLaunch"];
[[NSUserDefaults standardUserDefaults] registerDefaults:defs];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if([defaults boolForKey:#"isFirstLaunch"])
{
// Do your stuff here
[defaults setBool:NO forKey:#"isFirstLaunch"];
[defaults synchronize];
}
}
Don't set isFirstLaunch back to YES in the else-condition if you only want the view to be shown once.
You can try this
[[NSUserDefaults standardUserDefaults]setBool:YES forKey:#"AlreadyLaunched"];
[[NSUserDefaults standardUserDefaults]boolForKey:#"AlreadyLaunched"]
What is the standard way to preload an app with core data on delivert, for example i want to deliver my app with an example document which is to be available through core data after install.
So how do i package some initial data with an Core Data iOS App?
You can detect the first launch and then add the Data:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if ([[NSUserDefaults standardUserDefaults] boolForKey:#"HasLaunchedOnce"])
{
}
else
{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setBool:YES forKey:#"HasLaunchedOnce"];
[[NSUserDefaults standardUserDefaults] synchronize];
//Add your data here in the Core Data Database.
}
return YES;
}
I am following this answer to show a little intro message once the app has been started for the very first time.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
if(![[NSUserDefaults standardUserDefaults] boolForKey:#"hasSeenTutorial"]){
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:#"hasSeenTutorial"];
[[NSUserDefaults standardUserDefaults] synchronize];
[interface addHelpCards:nil];
NSLog(#"-First Time-");
} else {
NSLog(#"-Not First Time-");
}
...
}
Problem is ... it doesn't work. I am testing this on my device. As soon as I double tap to completely shutdown the app and then restart I get the "First Time" message again. Any idea on what's wrong with this approach? I'd appreciate your help.
if it is not working, I will eat my leg.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// ...
id _object = [[NSUserDefaults standardUserDefaults] valueForKey:#"hasSeenTutorial"];
if (_object == nil) {
[[NSUserDefaults standardUserDefaults] setValue:#(TRUE) forKey:#"hasSeenTutorial"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(#"-First Time-");
} else {
NSLog(#"-Not First Time-");
}
// ...
}
You're only setting YES for hasSeenTutorial if hasSeenTutorial is already YES (it's in the else). Just move that (and the synchronize) up to the first part of the if
you should be setting the Bool value in the if and not in the else. Right now the bool value will never be set
I have an app where I use NSUserDefaults to determine if it is the first time someone opens the app. If it is the first time, the app displays a tutorial page.
Now, I would like to change this so that if the user moves an ON/OFF switch to "ON", they will not see the tutorial when they start up the app. How do I store the user's selection of an ON/OFF switch in NSUserDefaults?
I did something like this with the following code:
Store it:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setBool:YES forKey:#"the_key"];
[[NSUserDefaults standardUserDefaults] synchronize]; //Thanks Henri Normak
Retrieve it:
[[NSUserDefaults standardUserDefaults] objectForKey:#"the_key"]
Wrap it in an NSNumber numberWithBool:.
[defaults setValue:[NSNumber numberWithBool:mySwitch.on] forKey:#"mySwitchValue"];
// and get it out
BOOL savedSwitch = [[defaults valueForKey:#"mySwitchValue"] boolValue];
You need two bool keys to be saved in NSUserDefaults to get the what you want. e.g. firstTime is used check first time app launch, showTutorial is used to check/save the switch change
You can set your boolean by using:
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:#"firstTime"];
and read it by using this code:
if([[NSUserDefaults standardUserDefaults] boolForKey:#"showTutorial"] || [[NSUserDefaults standardUserDefaults] boolForKey:#"firstTime"]) {
[self displayTutorial];
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:#"firstTime"];
}
else {
[self displayMainScreen];
}
Link the UISwitch on View from InterfaceBuilder to this action on valuechanged
-(IBAction)userSetOnOff:(id)sender
{
UISwitch *switchValue = sender;
if (switchValue.on){
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:#"showTutorial"];
}
else{
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:#"showTutorial"];
}
}
In one of my apps I check to see if NSUserDefaults has been used and if not set the one standard User Default variable.
-(id) init
{
standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *testInitState = [standardUserDefaults stringForKey:kInstallInit];
if (testInitState == nil)
{
#if(kStateModelDebug)
NSLog(#" State Model: First time initialized");
#endif
[self.standardUserDefaults setObject:#"true" forKey:kInstallInit];
[self.standardUserDefaults synchronize];
// Start the tutorials, init DB, etc
}
else
{
#if(kStateModelDebug)
NSLog(#" State Model has ALREADY been initialized");
#endif
// Read other state variables and/or init the startup processes
}
return self;
}
So far , up to ios 5.0 and the new 6.0, this has been a solution. Looking for comments on this solution.
One way is to simply persist a string with the switch status. If the user prefers the on position you'd store the string #"on". Else store the string #"off".
- (void) toggleUserPreference:(BOOL) preferOn {
NSString *newPreference = preferOn ? #"on" : #"off";
[[NSUserDefaults standardUserDefaults] setValue:newPreference
forKey:ONOFF_PREFERENCE_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];
}
I want to store an array with NSUserDefault, then, I put in applicationDidEnterBackground
[[NSUserDefaults standardUserDefaults] setObject:myArray forKey:#"myArray"];
and in application didFinishLaunchingWithOption
myArray= [[NSMutableArray alloc]
initWithArray:[[NSUserDefaults standardUserDefaults]
objectForKey:#"myArray"]];
it's ok for multitasking device, but for not-multitasking device, how can I solve?
Store the object in NSUserDefaults in -applicationWillTerminate:, if it hasn't already been saved by the invocation of -applicationDidEnterBackground: (i.e. check if multitasking is supported, if it is, then don't save it because it's already been saved.)
- (void) applicationWillTerminate:(UIApplication *) app {
if([[UIDevice currentDevice] respondsToSelector:#selector(isMultitaskingSupported)] &&
![[UIDevice currentDevice] isMultitaskingSupported]) {
[[NSUserDefaults standardUserDefaults] setObject:myArray forKey:#"myArray"];
}
}
Do not forget to sync the buffer before going into background:
[[NSUserDefaults standardUserDefaults] synchronize];
The previous answers are all correct, but note that neither applicationDidEnterBackground nor applicationWillTerminate are guaranteed to be called in all situations. You are usually better off storing important data whenever it has changed.
Save NSUserDefaults at
- (void)applicationWillTerminate:(UIApplication *)application
set
[[NSUserDefaults standardUserDefaults] setObject:myArray forKey:#"myArray"];
in
applicationWillTerminate
and don't forget to use the encodeWithCoder and initWithCoder inside the object that you are trying to save and that is contained in the array