I am using the NSUserDefaults Class to store some data but I have a normal conflict concerning the initialization.
I mean:
In my Class A in the didViewLoad method, I have set my NSUserDefaults data and afterwards in my Class B, in the didViewLoad, I want to get my NSUserDefaults data.
I have seen with the breakpoints that during the first-run-application, all the didViewLoad() of the application are performed, so I would like to put a condition in the viewDidLoad() of my Class B for the first-run-application to avoid random data initialization.
Have we got a keyword in Objective-C's framework instead of using static variable ?
eg:
ClassA--> didViewLoad():
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:kdataText forKey:#"udVariable"];
ClassB-> didViewLoad():
And:
ClassB--> didViewLoad():
if (!first_run){ // first_run --> KEYWORD FRAMEWORK???
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *var = [defaults objectForKey:#"udVariable"];
}
The key is to call registerDefaults even earlier, like in main or in the app delegate's applicationDidFinishLaunching:. From an app of mine:
[[NSUserDefaults standardUserDefaults] registerDefaults:
#{#"cardMatrixRows":#4, #"cardMatrixColumns":#3}];
Now there is a default default, as it were, and the order of events / view controllers no longer matters.
Swift 4:
Add this code to AppDelegate within didFinishLaunchingWithOptions:
UserDefaults.standard.register(defaults: ["cardMatrixRows": NSNumber(value: 4), "cardMatrixColumns": NSNumber(value: 3)])
Just check if
[defaults objectForKey:#"udVariable"] != nil
You can also use macro #define.
Related
I stored some setting for the peripheral that connected to the iOS device, but I want to add a button for the user to delete this peripheral, this means I must delete all setting related to this peripheral.
The store for this is simple using NSData:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:self.appDelegate.defaultBTServer.selectPeripheralInfo];
[defaults setObject:encodedObject forKey:self.appDelegate.defaultBTServer.selectPeripheralInfo.uuid];
[defaults synchronize];
But how to delete the setting related to this selectPeripheralInfo.uuid?
I found the
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:application.defaultBTServer.selectPeripheralInfo.uuid];
cannot work.
It looks like you might not be using the same key to add and remove the data. To add, you used:
self.appDelegate.defaultBTServer.selectPeripheralInfo.uuid
but to remove the data you used:
application.defaultBTServer.selectPeripheralInfo.uuid
If the values of those expressions aren't exactly the same, you won't be able to remove the data that you added because, obviously, the key will be wrong. So, check that.
Also, make sure that you call [defaults synchronize] after removing to update the defaults in storage.
i have tried to look for a way to manage the number of views and likes on videos in iOS but i don't know the best way to do it or the safest way since i'm saving it to memory do i use NSUserDefault
Yes. You can use NSUserDefault. It is to store the data and you can retreive it from any place of the projects. It can be done by following way:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:yourdata forKey:#"keyName"];
[userDefaults synchronize];
Write the below code where you want to get the saved data in userdefaults.
NSUserDefaults *userDefauls = [NSUserDefau;ts standardUserDefaults];
value = [userDefaults objectForKey:#"keyName"];
I'm creating a simple double value, saving it as NSUserDefault and trying to recover it...but it doesn't.
- (IBAction)try:(id)sender {
double value = 42.00;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setDouble:value forKey:#"kDoubleKey"];
// NSLog(#"loading %f",myDouble);
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSUserDefaults *fetchDefaults = [NSUserDefaults standardUserDefaults];
double intValue = [fetchDefaults doubleForKey:#"kDoubleKey"];
NSLog(#"douvle retrieve %f",intValue);
}
Do not forget to synchronise whenever you save something to the defaults:
put this at the end of your try method
[[NSUserDefaults standardUserDefaults]synchronize];
Here is what apple says about this: Because this method is automatically invoked at periodic intervals, use this method only if you cannot wait for the automatic synchronization (for example, if your application is about to exit) or if you want to update the user defaults to what is on disk even though you have not made any changes.
This question already has answers here:
Best way to save data on the iPhone
(7 answers)
Closed 9 years ago.
I want to save some initial settings values given by the user when the app is open for the first time, If the values are saved it shouldn't be appear next time. How to save these values inside the app. Some suggested to use .plist , while searched regarding this. Is that the right approach? or there any simpler option available?
I would suggest saving the information in an array and then saving the array on the NSUserDefaults singleton that is integrated on the device. That way you can always access the information from anywhere.
Have in mind that this approach is only viable if the info is small enough.
To save on the NSUserDefaults class:
[[NSUserDefaults standardUserDefaults] setObject:yourMutableArray forKey:#"Key"];
To get the value:
NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults]
objectForKey:#"Key"]];
The easiest option is to save these value in form of key-value pair into NSUserDefaults.
NSUserDefaults *stdDefaults = [NSUserDefaults standardUserDefaults];
if([stdDefaults objectForKey:#"APP_OPENED"] == FALSE)
{
[stdDefaults setValue:#"YOUR_VALUE" forKey:#"YOUR_KEY"];
//Store more values if you wish
[stdDefaults setBool:YES forKey:#"APP_OPENED"];
[stdDefaults synchronize];
}
If you want to save non encrypted data, you can use NSUserDefaults:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:txtfield1.text forKey:#"info1"];
[defaults setObject:txtfield2.text forKey:#"info2"];
[defaults synchronize];
If it includes passwords, better to use KeyChain. Otherwise, NSUserDefaults would be a good choice...
I would suggest using NSUserDefaults. Something like this:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL hasOpenedAppBefore = [defaults boolForKey:#"hasOpenedAppBefore"];
[defaults setBool:YES forKey:#"hasOpenedAppBefore"];
You can use NSUserDefaults which can store data
Read apple's doc
Make use of NSUserDefaults to store the data. The stored data can retrieved and modified whenever necessary.
Read NSUserDefaults Class Reference
Read Tutorial
NSUserDefaults is the best option for store data inside application and you can easily use it throughout the application.
I want to display a help message on a view controller when the app is installed and opened for the very first time ONLY.
Is there a method I can use to do this?
You can display the help message once, and then store a boolean value in NSUserDefaults to indicate that it should not be shown again:
NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
BOOL appHasBeenLaunchedBefore = [userDefaults boolForKey:#"HasBeenLaunched"];
if (!appHasBeenLaunchedBefore)
{
[self showHelpMessage];
}
[userDefaults setBool:YES forKey:"HasBeenLaunched"];
Use Grand Central Dispatch's dispatch_once() and check some persistent storage.
static dispatch_once_t pred;
dispatch_once(&pred,^{
NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
BOOL hasLaunched = [userDefaults boolForKey:kAppHasLaunched];
if (!hasLaunched) {
[self showFirstLaunchMessage];
[userDefaults setBool:YES forKey:kAppHasLaunched];
}
});
This is the easiest way to ensure code only gets run once in your app per launch (in this case the block will only be executed once). More information about this is in the Grand Central Dispatch Reference. In this block you simply need to check some persistent storage, such as your preferences, to see if your app has ever launched before and display a message as appropriate.
Use a key in the user defaults. For example:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
BOOL launchedBefore = [userDefaults boolForKey:#"hasRunBefore"];
if(!hasRunBefore)
{
NSLog(#"this is my first run");
[userDefaults setBool:YES forKey:#"hasRunBefore"];
}
The user defaults are backed up by iTunes, so it'll normally be the user's first launch rather than the first launch per device.
EDIT: this is explicitly the same answer as e.James gave before me. The 'other answers have been posted' bar failed to appear. I'll leave it up for the example code but don't deserve credit fir a first answer.