I have an NSMutableArray in which I am adding objective and storing in user defaults, but while adding it is crashing.
if ([[NSUserDefaults standardUserDefaults] objectForKey:#"bssidObserverArray"]) {
bssidObserverArray = [[NSUserDefaults standardUserDefaults] objectForKey:#"bssidObserverArray"];
}
if (bssidObserverArray.count > 0) {
if (![bssidObserverArray containsObject:vendorID]) {
NSLog(#"bssidObserverArray %#",bssidObserverArray);
// In this line app is getting crashed
[bssidObserverArray addObject:vendorID];
[[NSUserDefaults standardUserDefaults] setObject:bssidObserverArray forKey:#"bssidObserverArray"];
}
}else{
[bssidObserverArray addObject:vendorID];
[[NSUserDefaults standardUserDefaults] setObject:bssidObserverArray forKey:#"bssidObserverArray"];
}
Any suggestions would be more helpful.
Assuming bssidObserverArray is NSMutable array then come the problem here .
if ([[NSUserDefaults standardUserDefaults] objectForKey:#"bssidObserverArray"]) {
bssidObserverArray = [[NSUserDefaults standardUserDefaults] objectForKey:#"bssidObserverArray"];
}
since NSUserdefaults returns immutable. you can do like this
if ([[NSUserDefaults standardUserDefaults] objectForKey:#"bssidObserverArray"]) {
NSArray *someArray = [[NSUserDefaults standardUserDefaults] objectForKey:#"bssidObserverArray"];
bssidObserverArray = [someArray mutableCopy];
}
I save image using NSUaerDefaults from image picker using this code:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image=[info objectForKey:UIImagePickerControllerOriginalImage];
NSData *imagedata=[NSData dataWithData:UIImagePNGRepresentation(image)];
NSUserDefaults *default_bg=[NSUserDefaults standardUserDefaults];
[default_bg setObject:imagedata forKey:#"image"];
[default_bg synchronize];
[self dismissViewControllerAnimated:YES completion:nil];
}
and getting in other view controller using this code:
NSUserDefaults *defaults_bgvw = [NSUserDefaults standardUserDefaults];
[defaults_bgvw synchronize];
UIImageView *bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[defaults_bgvw objectForKey:#"image"]]];
//bgImageView.contentMode=UIViewContentModeScaleAspectFit;
bgImageView.frame = self.view.bounds;
[self.view addSubview:bgImageView];
[self.view sendSubviewToBack:bgImageView];
When I run this code getting error like
"Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFData hasPrefix:]: unrecognized selector sent to instance 0x147c8590'"
Never user NSUserDefaults to store images or other large amounts of data. You should simply store the file on the file system.
That aside, your code to create an image from the stored data is flawed. You want this instead:
NSData *imageData = [defaults_bgvw objectForKey:#"image"];
UIImage *bgImage = [UIImage imageWithData:imageData];
UIImageView *bgImageView = [[UIImageView alloc] initWithImage:bgImage];
Note how the code is split up. This is easier to read and much easier to debug.
But again, do not store images in NSUserDefaults.
Unrelated but the following line:
NSData *imagedata=[NSData dataWithData:UIImagePNGRepresentation(image)];
can simply be:
NSDate *imagedata = UIImagePNGRepresentation(image);
No need to create the extra NSDate instance.
And don't needlessly call synchronize. The following:
NSUserDefaults *defaults_bgvw = [NSUserDefaults standardUserDefaults];
[defaults_bgvw synchronize];
should simply be:
NSUserDefaults *defaults_bgvw = [NSUserDefaults standardUserDefaults];
A call to synchronize is rarely needed at all and it definitely is never needed just to read values.
You can save & load custom object into NSUserDefault using following methods. You need to use NSKeyedArchiver class for the same.
Alternate 1 :
- (void)saveCustomObject:(UIImage *)object key:(NSString *)key {
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:object];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:encodedObject forKey:key];
[defaults synchronize];
}
- (UIImage *)loadCustomObjectWithKey:(NSString *)key {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *encodedObject = [defaults objectForKey:key];
UIImage *object = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
return object;
}
Alternate 2 :
Save image to NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:UIImagePNGRepresentation(image) forKey:#"myImage"];
Retrieve Image from NSUserDefaults
NSData* imageData = [[NSUserDefaults standardUserDefaults] objectForKey:#"myImage"];
UIImage* image = [UIImage imageWithData:imageData];
I'm trying to make a button's background change from background1 to background2 when it's clicked and stay on background2 even when the app is restarted.
I've managed to do that, but when I restart the app the background is malformed ( the background2 is a transparent circle) its showing the circle, but the transparent part becomes white..
The button is a custom one.
Any ideas?
Thanks guys
The problem were in the NSUserDefaults saving process, I now use this :
NSData *imageData = UIImagePNGRepresentation(contactImage);
Instead of :
NSData *imageData = UIImageJPEGRepresentation(contactImage, 100);
Hi this will be useful to you..
- (void)viewDidLoad
{
[super viewDidLoad];
NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:#"BackgroundColor"];
if (colorData != nil)
{
NSString *stringColor = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
CIColor *coreColor = [CIColor colorWithString:stringColor];
UIColor *color = [UIColor colorWithCIColor:coreColor];
[self.btnNext setBackgroundColor:color];
}
}
- (IBAction)next:(id)sender
{
[self.btnNext setBackgroundColor:[UIColor clearColor]];
CGColorRef colorRef = [UIColor clearColor].CGColor;
NSString *colorString = [CIColor colorWithCGColor:colorRef].stringRepresentation;
NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:colorString];
[[NSUserDefaults standardUserDefaults] setObject:colorData forKey:#"BackgroundColor"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
I have checked in ios 7 3.5 inch screen it is working..
but donot know on other deveices...
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 save a string into the NSUserDefaults?
NSString *valueToSave = #"someValue";
[[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:#"preferenceName"];
[[NSUserDefaults standardUserDefaults] synchronize];
to get it back later
NSString *savedValue = [[NSUserDefaults standardUserDefaults]
stringForKey:#"preferenceName"];
more precisely
-(void)saveToUserDefaults:(NSString*)myString
{
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
if (standardUserDefaults) {
[standardUserDefaults setObject:myString forKey:#"timestamps"];
[standardUserDefaults synchronize];
}
}
Here's how to do the same with Swift;
var valueToSave = "someValue"
NSUserDefaults.standardUserDefaults().setObject(valueToSave, forKey: "preferenceName")
To get it back later;
if let savedValue = NSUserDefaults.standardUserDefaults().stringForKey("preferenceName") {
// Do something with savedValue
}
In Swift 3.0
var valueToSave = "someValue"
UserDefaults.standard.set(valueToSave, forKey: "preferenceName")
if let savedValue = UserDefaults.standard.string(forKey: "preferenceName") {
}
Something like this:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
// saving an NSString
[prefs setObject:#"TextToSave" forKey:#"keyToLookupString"];
Then to retrieve:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
// getting an NSString
NSString *myString = [prefs stringForKey:#"keyToLookupString"];
You should really check out Apple's NSUserDefaults Class Reference and also maybe this tutorial: iPhone Programming Tutorial – Saving/Retrieving Data Using NSUserDefaults
Do not forget this statement because otherwise it may not always work:
[standardUserDefaults synchronize];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
// saving an NSString
[prefs setObject:#"TextToSave" forKey:#"keyToLookupString"];
// saving an NSInteger
[prefs setInteger:42 forKey:#"integerKey"];
// saving a Double
[prefs setDouble:3.1415 forKey:#"doubleKey"];
// saving a Float
[prefs setFloat:1.2345678 forKey:#"floatKey"];
// This is suggested to synch prefs, but is not needed (I didn't put it in my tut)
[prefs synchronize];
Retrieving
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
// getting an NSString
NSString *myString = [prefs stringForKey:#"keyToLookupString"];
// getting an NSInteger
NSInteger myInt = [prefs integerForKey:#"integerKey"];
// getting an Float
float myFloat = [prefs floatForKey:#"floatKey"];
[[NSUserDefaults standardUserDefaults] setValue:aString forKey:aKey]
A good practice is also to use a constant for the key to avoid bugs where you do not store and read with the same key
NSString* const TIME_STAMPS_KEY = #"TIME_STAMPS_KEY";
In Swift5 and Xcode 10.2
//Save
UserDefaults.standard.set(true, forKey: "Key1") //Bool
UserDefaults.standard.set(1, forKey: "Key2") //Integer
UserDefaults.standard.set("This is my string", forKey: "Key3") //String
UserDefaults.standard.synchronize()
//Retrive
UserDefaults.standard.bool(forKey: "Key1")
UserDefaults.standard.integer(forKey: "Key2")
UserDefaults.standard.string(forKey: "Key3")
//Remove
UserDefaults.standard.removeObject(forKey: "Key3")
Note: Save text data(means String, Array, Dictionary etc.) in UserDefaults.
Don't save images in UserDefaults, it's not recommended(Save images in local directory).
-(void)saveToUserDefaults:(NSString*)string_to_store keys:(NSString *)key_for_the_String
{
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
if (standardUserDefaults) {
[standardUserDefaults setObject:string_to_store forKey:key_for_the_String];
[standardUserDefaults synchronize];
}
}
And call it by:
[self saveToUserDefaults:#"string_to_store" : #"key_for_the_string"];
Retrieve the string by using:
NSString * stored_string = [[NSUserDefaults standardUserDefaults] stringforkey:key_for_the_String]
FirstView
{
NSMutableArray *array; }
- (void)viewDidLoad {
[super viewDidLoad];
array = [[NSMutableArray alloc]init];
array = [[NSUserDefaults standardUserDefaults]objectForKey:#"userlist"];
NSLog(#"%lu",(unsigned long)array.count);
if (array>0)
{
for (int i=0; i<array.count; i++)
{
NSDictionary *dict1 = #{#"Username":[[array valueForKey:#"Username"] objectAtIndex:i],#"Mobilenumber":[[array valueForKey:#"Mobilenumber"] objectAtIndex:i],#"Firstname":[[array valueForKey:#"Firstname"] objectAtIndex:i],#"Lastname":[[array valueForKey:#"Lastname"] objectAtIndex:i],#"dob":[[array valueForKey:#"dob"] objectAtIndex:i],#"image":[[array valueForKey:#"image"] objectAtIndex:i]};
NSLog(#"%#",dict1);
NSArray *array1 = [[NSArray alloc]initWithObjects:dict1, nil];
[[NSUserDefaults standardUserDefaults] setObject:array1 forKey:#"UserList"];
}
}
}
ImagePicker
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
self.imaGe.image = chosenImage;
[picker dismissViewControllerAnimated:YES completion:NULL];
}
(IBAction)submitBton:(id)sender {
NSMutableArray *array2 = [[NSMutableArray alloc]initWithArray:
[[NSUserDefaults standardUserDefaults]objectForKey:
#"userlist"]];
UIImage *ima = _imaGe.image;
NSData *imagedata = UIImageJPEGRepresentation(ima,100);
NSDictionary *dict = #{#"Username":_userTxt.text,#"Lastname":_lastTxt.text,#"Firstname":_firstTxt.text,#"Mobilenumber":_mobTxt.text,#"dob":_dobTxt.text,#"image":imagedata};
[array2 addObject:dict];
[[NSUserDefaults standardUserDefaults]setObject:array2
forKey:#"userlist"];
NSLog(#"%#",array2);
[self performSegueWithIdentifier:#"second" sender:self];
}
(IBAction)chooseImg:(id)sender {
UIImagePickerController *picker = [[UIImagePickerController
alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType =
UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:picker animated:YES completion:NULL];
}
second View {
NSMutableArray *arr; }
- (void)viewDidLoad {
[super viewDidLoad];
arr =[[NSMutableArray alloc]init];
arr = [[NSUserDefaults standardUserDefaults]objectForKey:#"userlist"]; }
#pragma mark- TableView DataSource
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1; }
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return arr.count; }
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellId = #"tablecell";
TableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:cellId];
cell.userLbl.text =[[arr valueForKey:#"username"] objectAtIndex:indexPath.row];
cell.ageLbl.text =[[arr valueForKey:#"dob"] objectAtIndex:indexPath.row];
cell.profileImg.image =[UIImage imageNamed:[[arr valueForKey:#"image"] objectAtIndex:indexPath.row]];
return cell; }
For saving use this :
[[NSUserDefaults standardUserDefaults]setObject:#"YES" forKey:#"KTerminated"];
[[NSUserDefaults standardUserDefaults]synchronize];
For Retriveing use this :
[[[NSUserDefaults standardUserDefaults]stringForKey:#"KTerminated"] isEqualToString:#"YES"];
update for Swift 3
func setObject(value:AnyObject ,key:String)
{
let pref = UserDefaults.standard
pref.set(value, forKey: key)
pref.synchronize()
}
func getObject(key:String) -> AnyObject
{
let pref = UserDefaults.standard
return pref.object(forKey: key)! as AnyObject
}
In Swift 4.0.3 Xcode 9
============set Data in UserDefaults =========
UserDefaults.standard.set(userName, forKey: "userName")
UserDefaults.standard.synchronize()
============Get Data in UserDefaults =========
let userName = UserDefaults.standard.string(forKey: "userName")
print(userName ?? "Gera")
userNameTextField.text = ""+userName!
Here Swift updated:
let userID = "BOB"
Declare userDefaults:
let defaults = UserDefaults.standard
defaults.setValue(userID, forKey: "userID")
And get it:
let userID = defaults.object(forKey: "userID")
Here For Swift, I have created two functions which will be save and retrive value from the Preferences.
This will be help full for you.
// For saving object
static func setObject(value:AnyObject ,key:String)
{
let pref = NSUserDefaults.standardUserDefaults()
pref.setObject(value, forKey: key)
pref.synchronize()
}
static func getObject(key:String) -> AnyObject
{
let pref = NSUserDefaults.standardUserDefaults()
return pref.objectForKey(key)!
}