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.
Related
I need to update / add a key -> value pair in a NSMutableArray.
I would like to add a key with a fix value if the key isn't set already.
I tried the following - but the app is crashing at addObject with a "mutating method sent to immutable object" error:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *bookmarks = [defaults mutableArrayValueForKey:#"bookmarks"];
for (id bookmark in bookmarks) {
if ([bookmark objectForKey:#"type"] == NULL){
[bookmark addObject:#"old" forKey:#"type"];
}
}
[[NSUserDefaults standardUserDefaults] synchronize];
Your outer array contains immutable dictionaries. One option would be the following:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *bookmarks = [defaults mutableArrayValueForKey:#"bookmarks"];
[booksmarks enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSDictionary *bookmark, NSUInteger index, BOOL *stop) {
if (!bookmark[#"type"]) {
NSMutableDictionary *mutable = [bookmark mutableCopy];
mutable[#"type"] = #"old";
[bookmarks replaceObjectAtIndex:index withObject:[mutable copy]];
}
}];
// Update NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:bookmarks forKey:#"bookmarks"];
This should be nice an efficient since it can update multiple dictionaries concurrently.
Try this:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//SAVING
NSMutableArray *bookmarksSaving = [NSMutableArray new];
[bookmarksSaving addObject:[[NSMutableDictionary alloc] initWithObjects:#[#"red"] forKeys:#[#"color"]]];
[bookmarksSaving addObject:[[NSMutableDictionary alloc] initWithObjects:#[#"yellow"] forKeys:#[#"color"]]];
[bookmarksSaving addObject:[[NSMutableDictionary alloc] initWithObjects:#[#"green",#"new"] forKeys:#[#"color",#"type"]]];
[defaults setObject:bookmarksSaving forKey:#"bookmarks"];
[[NSUserDefaults standardUserDefaults] synchronize];
//MODIFY
NSMutableArray *bookmarks = [defaults mutableArrayValueForKey:#"bookmarks"];
NSUInteger index = 0;
for (NSDictionary *bookmark in bookmarks) {
NSMutableDictionary *bookmarkMutable = [bookmark mutableCopy];
if ([bookmarkMutable objectForKey:#"type"] == nil)
{
[bookmarkMutable setValue:#"old" forKey:#"type"];
[bookmarks replaceObjectAtIndex:index withObject:bookmarkMutable];
}
index++;
}
[[NSUserDefaults standardUserDefaults] synchronize];
You have to save your bookmarks as NSMutableDictionary to be able to add/remove keys/value
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *bookmarks = [defaults objectForKey:#"bookmarks"];
NSMutableArray *newBookMarks = [bookmarks mutableCopy];
for (NSDictionary *bookmark in bookmarks) {
NSMutableDictionary *newBookmark = [bookmark mutableCopy];
if (![bookmark objectForKey:#"type"]){
[newBookmark setObject:#"old" forKey:#"type"];
}
[newBookMarks addObject:newBookmark];
}
[defaults setObject:newBookMarks forKey:#"bookmarks"];
[defaults synchronize];
Can anyone give me any link or file, which could be used globally for a project to Store data to NSUserDefault.
Which contains method to save dictionary, array,string,integer all.
#import <Foundation/Foundation.h>
#import "BSUser.h"
#interface CLServerDataManager : NSObject
+(BOOL) saveServerDataToUserDefaults:(id)data;
+(NSDictionary*) getServerDataFromUserDefaults;
//For language Selection
+(void) setLanguage:(NSString*)LanguageName;
+(NSString*) getLanguage;
+(void) setUserPassword:(NSString*)password;
+(NSString*) getUserPassword;
+(void) setUserID:(NSString*)password;
+(NSString*) getUserID;
+(void) setUserUUID:(NSString*)uuid;
+(NSString*) getUserUUID;
+(void) setUserName:(NSString*)name;
+(NSString*) getUserName;
+(void) setimagedata:(float)data;
+(float) getimagedata;
+(void) setUserProfile:(BSUser*)user;
+(BSUser*) getUserProfile;
+ (void) setApplicationPurchaseStatus:(BOOL)purchaseStatus forUser:(NSString*)fbUserID;
+ (BOOL) getApplicationPurchaseStatusforUser:(NSString*)fbUserID;
+ (void) sethintAndTutorial:(BOOL)hintState;
+ (BOOL) gethintAndtutorial;
+ (void) setDeviceToken:(NSString*)deviceToken;
+ (NSString*) getDeviceToken;
//Methods for clear all data from user defaults
+ (void) resetServerDataManager;
#end
and .m file for this
#import "CLServerDataManager.h"
#import "ClConfig.h"
#implementation CLServerDataManager
+(BOOL) saveServerDataToUserDefaults:(id)data {
// if (!data) {
// return NO;
// }
// NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// [defaults setObject:data forKey:USER_ID];
// [defaults synchronize];
// return YES;
return NO;
}
+(NSDictionary*) getServerDataFromUserDefaults {
// NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// NSDictionary* rememberMe = [defaults objectForKey:USER_ID];
// if (rememberMe == nil) {
// return nil;
// }
// return rememberMe;
return nil;
}
//For the store user select language and again fetch
+(void) setLanguage:(NSString*)LanguageName {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:LanguageName forKey:#"Language"];
[defaults synchronize];
}
+(NSString*) getLanguage {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString* Mylanguage = [defaults objectForKey:#"Language"];
if (Mylanguage == nil) {
return nil;
}
return Mylanguage;
}
//for store information cache for user's pics download
+(void) setimagedata:(float)data{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[NSNumber numberWithFloat:data] forKey:#"cache"];
[defaults synchronize];
}
+(float)getimagedata{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
float data = [[defaults objectForKey:#"cache"] floatValue];
if (data == 0) {
return 0;
}
return data;
}
+(void) setUserPassword:(NSString*)password {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:password forKey:#"password"];
[defaults synchronize];
}
+(NSString*) getUserPassword {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString* rememberMe = [defaults objectForKey:#"password"];
if (rememberMe == nil) {
return nil;
}
return rememberMe;
}
+(void) setUserID:(NSString*)password {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:password forKey:#"userID"];
[defaults synchronize];
}
+(NSString*) getUserID {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString* rememberMe = [defaults objectForKey:#"userID"];
if (rememberMe == nil) {
return nil;
}
return rememberMe;
}
+(void) setUserUUID:(NSString*)uuid {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:uuid forKey:#"userUUID"];
[defaults synchronize];
}
+(NSString*) getUserUUID {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString* rememberMe = [defaults objectForKey:#"userUUID"];
if (rememberMe == nil) {
return nil;
}
return rememberMe;
}
+(void) setUserName:(NSString*)name {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:name forKey:#"userName"];
[defaults synchronize];
}
+(NSString*) getUserName {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString* name = [defaults objectForKey:#"userName"];
if (name == nil) {
return nil;
}
return name;
}
//store the current login user profile to user defaults
+(void) setUserProfile:(BSUser*)user {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[NSKeyedArchiver archivedDataWithRootObject:user] forKey:#"user_profile"];
[defaults synchronize];
}
+(BSUser*) getUserProfile {
BSUser* returnObject = nil;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [defaults objectForKey:#"user_profile"];
if (dataRepresentingSavedArray != nil)
{
returnObject = (BSUser*)[NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
}
return returnObject;
}
+ (void) setApplicationPurchaseStatus:(BOOL)purchaseStatus forUser:(NSString*)fbUserID {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[NSNumber numberWithBool:purchaseStatus] forKey:fbUserID];
[defaults synchronize];
}
+ (BOOL) getApplicationPurchaseStatusforUser:(NSString*)fbUserID {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSNumber* purchased = [defaults objectForKey:fbUserID];
if (purchased == nil) {
return NO;
}
return [purchased boolValue];
}
#pragma mark Set hint and tutotrial
+ (void) sethintAndTutorial:(BOOL)hintState{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[NSNumber numberWithBool:hintState] forKey:#"hint"];
[defaults synchronize];
}
+ (BOOL) gethintAndtutorial{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSNumber* hintstate = [defaults objectForKey:#"hint"];
if (hintstate == nil) {
return NO;
}
return [hintstate boolValue];
}
+ (void) setDeviceToken:(NSString*)deviceToken {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:deviceToken forKey:#"DeviceToken"];
[defaults synchronize];
}
+ (NSString*) getDeviceToken {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString* name = [defaults objectForKey:#"DeviceToken"];
if (name == nil) {
return nil;
}
return name;
}
+ (void) resetServerDataManager {
[[self class] setLanguage:nil];
[[self class] setUserID:nil];
[[self class] setUserName:nil];
[[self class] setUserPassword:nil];
[[self class] setUserProfile:nil];
[[self class] setUserUUID:nil];
NSHTTPCookie *cookie;
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [storage cookies])
{
NSString *domainName = [cookie domain];
NSRange domainRange = [domainName rangeOfString:#"facebook"];
if(domainRange.length > 0)
{
[storage deleteCookie:cookie];
}
}
}
Try below link, You will get thing which you need..
NSUserDefaults
This question already has answers here:
Attempt to set a non-property-list object as an NSUserDefaults
(12 answers)
Closed 8 years ago.
NSMutableArray *mutableArray = [NSMutableArray array];
Prostate *prostate = [Prostate new];
prostate.prostateCheckTimeString = self.prostateCheckTime.text;
prostate.prostateCubeString =self.prostateCube.text;
prostate.prostateAntigemString =self.prostateAntigem.text;
prostate.peeSpeedMaximumString =self.peeSpeedMaximum.text;
prostate.peeRemenderString =self.peeRemender.text;
[mutableArray addObject:prostate];
NSArray *tempArray = [[NSArray alloc]initWithArray:self.mutableArray];
[Global saveArrayToUserDefault:prostateArray saveValue:tempArray];
NSArray *array = [Global getArrayFromUserDefault:prostateArray];
//Below is my global object
**+(void)saveArrayToUserDefault:(NSString *)userDefaultKey saveValue:(NSArray *)value**
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:value forKey:prostateArray];
[userDefaults synchronize];
}
**+(NSArray *)getArrayFromUserDefault:(NSString *)userDefaultKey**
{
NSArray *temp;
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
temp = [userDefaults objectForKey:userDefaultKey];
return temp;
}
-----------------------------------Description ---------------------------------------
I had Been Search for a while , I know NSUserDefault can only store NSArray , I tried to convert NSMutableArray to NSArray , but still got error
-----------------------------------Error ---------------------------------------------
Property list invalid for format: 200 (property lists cannot contain objects of type 'CFType') Attempt to set a non-property-list object (
""
Implement the <NSCoding> protocol in your entity class which you wanna save
-(void)writeArrayWithCustomObjToUserDefaults:(NSString *)keyName withArray:(NSMutableArray *)myArray {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray];
[defaults setObject:data forKey:keyName];
[defaults synchronize]; }
-(NSArray *)readArrayWithCustomObjFromUserDefaults:(NSString*)keyName {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:keyName];
NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[defaults synchronize];
return myArray; }
Prostate is your custom object and NSUserDefaults does not allow you to save it.
So you have to Archive it before saving to NSUserDefaults and Unarchive it when reading back from NSUserDefaults.
So your methods to save and read user defaults data should look like:
-(void)writeArrayWithCustomObjToUserDefaults:(NSString *)keyName withArray:(NSMutableArray *)myArray {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray];
[defaults setObject:data forKey:keyName];
[defaults synchronize];
}
-(NSArray *)readArrayWithCustomObjFromUserDefaults:(NSString*)keyName {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:keyName];
NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
return myArray;
}
I have a main page having 3 textfield in my first view as i navigate to different view and return back to my first view (i.e after i enter all the values i moving to next page).I want my 3 textfield to retain its value when i go back to my main page here my sample code :
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *mobile = MobileNum.text;
[defaults setObject:mobile forKey:self.MobileNum.text];
NSString *amountText = amount.text;
[defaults setObject:amountText forKey:self.amount.text];
[defaults synchronize];
NSString *temp = [defaults objectForKey:self.MobileNum.text];
NSString *temp1 = [defaults objectForKey:self.amount.text];
NSLog(#"%# %#",temp,temp1);
at you viewWillDisappear method store the defaults like.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *mobile = MobileNum.text;
[defaults setObject:mobile forKey:#"mobileNumber"];
NSString *amountText = amount.text;
[defaults setObject:amountText forKey:#"amount"];
[defaults synchronize];
again at your viewWillAppear method retrieve the values like.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([[defaults valueForKey:#"mobileNumber"] length]>0){
MobileNum.text=[defaults valueForKey:#"mobileNumber"];
}
else {
MobileNum.text=#"";
}
if ([[defaults valueForKey:#"amount"] length]>0) {
amount.text=[defaults valueForKey:#"amount"];
}
else {
amount.text=#"";
}
it will work.
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"];