0

I have a problem with saving from a custom class. I tried to save errors from some place in my code in NSUserDefaults but it doesn't work.

H file:

#import <Foundation/Foundation.h>
@interface Errors : NSObject<NSCoding>
@property (nonatomic,strong) NSString*  type;
@property (nonatomic,strong) NSString*  verNum;
@property (nonatomic,strong) NSString*  title;
@property (nonatomic,strong) NSString*  content;
@property (nonatomic,strong) NSString*  source;
@property (nonatomic,strong) NSString*  userId;
@property (nonatomic,strong) NSNumber*  videoId;

@end

M file:

#import "Errors.h"
@implementation Errors
@synthesize verNum;
@synthesize type;
@synthesize title;
@synthesize content;
@synthesize source;
@synthesize userId;
@synthesize videoId;

- (void)encodeWithCoder:(NSCoder *)encoder{
    [encoder encodeObject:self.verNum forKey:@"verNum"];
    [encoder encodeObject:self.type forKey:@"type"];
    [encoder encodeObject:self.title forKey:@"title"];
    [encoder encodeObject:self.content forKey:@"content"];
    [encoder encodeObject:self.source forKey:@"source"];
    [encoder encodeObject:self.userId forKey:@"userId"];
    [encoder encodeObject:self.videoId forKey:@"videoId"];
}

- (id)initWithCoder:(NSCoder *)decoder{
    self = [super init];
    if( self != nil ) {
        self.verNum = [decoder decodeObjectForKey:@"verNum"];
        self.type = [decoder decodeObjectForKey:@"type"];
        self.title = [decoder decodeObjectForKey:@"title"];
        self.content = [decoder decodeObjectForKey:@"content"];
        self.source = [decoder decodeObjectForKey:@"source"];
        self.userId = [decoder decodeObjectForKey:@"userId"];
        self.videoId = [decoder decodeObjectForKey:@"videoId"];
    }
    return self;
}
@end

Saving:

errorsDitalis = [[Errors alloc]init];
errorsDitalis.verNum = (NSString *) [[request userInfo] objectForKey:@"verNum"];
errorsDitalis.type =(NSString *)  [[request userInfo] objectForKey:@"type"];
errorsDitalis.title =(NSString *)  [[request userInfo] objectForKey:@"title"];
errorsDitalis.content =(NSString *)  [[request userInfo] objectForKey:@"content"];
errorsDitalis.source =(NSString *)  [[request userInfo] objectForKey:@"source"];
errorsDitalis.userId =(NSString *)  [[request userInfo] objectForKey:@"userId"];
errorsDitalis.videoId =(NSNumber *)  [[request userInfo] objectForKey:@"videoId"];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:errorsDitalis forKey:@"ErrorList"];
[userDefaults synchronize];

Loading:

Errors * newError = [[Errors alloc]init];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
newError = [userDefaults objectForKey:@"ErrorList"];

It just returns nil for newErrors. I tried to use this help but it didn't work. Does someone have an idea?

Community
  • 1
  • 1
Sosily
  • 706
  • 1
  • 10
  • 26
  • http://soulwithmobiletechnology.blogspot.in/2011/08/how-to-save-array-of-custom-class-in.html have a look at this – Amit Hooda Nov 05 '12 at 08:55

2 Answers2

0

Try

[self setVerNum:[decoder decodeObjectForKey:@"verNum"]];

instead of

self.verNum = [decoder decodeObjectForKey:@"verNum"];

I believe you should use the setters when you call initWithCoder

gsach
  • 5,715
  • 7
  • 27
  • 42
0

i think i should do :

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:self.errorsDitalis] forKey:@"ErrorList"];
    [[NSUserDefaults standardUserDefaults] synchronize];

and not:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:errorsDitalis forKey:@"ErrorList"];
[userDefaults synchronize];

and load with:

newError = (Errors *)[NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"ErrorList"]];
Sosily
  • 706
  • 1
  • 10
  • 26