2

NSDictionary を NSUserDefualts に保存しようとしています。

ディクショナリは、3 つの異なるカスタム クラスで構成されます。

@interface PastOrder : NSObject <NSCoding>
{
    NSDate *timeIn;
    NSDate *timeOut;
    NSString *status;
    NSMutableArray *myItems;
}

@property (nonatomic, retain) NSDate *timeIn;
@property (nonatomic, retain) NSDate *timeOut;
@property (nonatomic, retain) NSString *status;
@property (nonatomic, retain) NSMutableArray *myItems;

@end
@implementation PastOrder

@synthesize timeIn, timeOut, status, myItems;
#define PastOrderTimeInKey @"PastOrderTimeInKey"
#define PastOrderTimeOutKey @"PastOrderTimeOutKey"
#define PastOrderStatusKey @"PastOrderStatusKey"
#define PastOrderMyItemsKey @"PastOrderMyItemsKey"

-(id)initWithCoder:(NSCoder*)decoder
{
    self = [super init];
    if(self)
    {
        self.timeIn = [decoder decodeObjectForKey:PastOrderTimeInKey];
        self.timeOut = [decoder decodeObjectForKey:PastOrderTimeOutKey];
        self.status = [decoder decodeObjectForKey:PastOrderStatusKey];
        self.myItems = [decoder decodeObjectForKey:PastOrderMyItemsKey];
    }
    return self;
}
-(void)encodeWithCoder:(NSCoder*)encoder
{
    [encoder encodeObject:self.timeIn forKey:PastOrderTimeInKey];
    [encoder encodeObject:self.timeOut forKey:PastOrderTimeOutKey];
    [encoder encodeObject:self.status forKey:PastOrderStatusKey];
    [encoder encodeObject:self.myItems forKey:PastOrderMyItemsKey];
}
-(void)dealloc
{
    self.timeIn = nil;
    self.timeOut = nil;
    self.status = nil;
    self.myItems = nil;
}
@end

@interface PastOrderItem : NSObject <NSCoding>
{
    NSNumber *itemID;
    NSString *status;
    NSMutableArray *itemChoices;
}
@property (nonatomic, retain) NSNumber *itemID;
@property (nonatomic, retain) NSString *status;
@property (nonatomic, retain) NSMutableArray *itemChoices;
@end
@implementation PastOrderItem

@synthesize itemID,status,itemChoices;
#define PastOrderItemItemIDKey @"PastOrderItemItemIDKey"
#define PastOrderItemStatusKey @"PastOrderItemStatusKey"
#define PastOrderItemItemChoicesKey @"PastOrderItemItemChoicesKey"
-(id)initWithCoder:(NSCoder*)decoder
{
    self = [super init];
    if(self)
    {
        self.itemID = [decoder decodeObjectForKey:PastOrderItemItemIDKey];
        self.itemChoices = [decoder decodeObjectForKey:PastOrderItemItemChoicesKey];
        self.status = [decoder decodeObjectForKey:PastOrderItemStatusKey];
     }
    return self;
}
-(void)encodeWithCoder:(NSCoder*)encoder
{
    [encoder encodeObject:self.itemID forKey:PastOrderItemItemIDKey];
    [encoder encodeObject:self.itemChoices forKey:PastOrderItemItemChoicesKey];
    [encoder encodeObject:self.status forKey:PastOrderItemStatusKey];
}
-(void)dealloc
{
    self.itemID = nil;
    self.itemChoices = nil;
    self.status = nil;
}
@end

@interface PastOrderItemChoice : NSObject <NSCoding>
{
    NSNumber *modifierID;
    NSNumber *modifierChoice;
}
@property (nonatomic, retain) NSNumber *modifierID;
@property (nonatomic, retain) NSNumber *modifierChoice;
@end
@implementation PastOrderItemChoice

@synthesize modifierID, modifierChoice;
#define PastOrderItemChoiceModifierIDKey @"PastOrderItemChoiceModifierIDKey"
#define PastOrderItemChoiceModifierChoiceKey @"PastOrderItemChoiceModifierChoiceKey"
-(id)initWithCoder:(NSCoder*)decoder
{
    self = [super init];
    if(self)
    {
        self.modifierID = [decoder decodeObjectForKey:PastOrderItemChoiceModifierIDKey];
        self.modifierChoice = [decoder decodeObjectForKey:PastOrderItemChoiceModifierChoiceKey];
     }
    return self;
}
-(void)encodeWithCoder:(NSCoder*)encoder
{
    [encoder encodeObject:self.modifierID forKey:PastOrderItemChoiceModifierIDKey];
    [encoder encodeObject:self.modifierChoice forKey:PastOrderItemChoiceModifierChoiceKey];
}
-(void)dealloc
{
    self.modifierID = nil;
    self.modifierChoice = nil;

}
@end

これらは、この NSDictionary 内にある 3 つのクラスです。ロードして保存する方法は次のとおりです。

-(void)SavePrefs
{
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    NSData* data=[NSKeyedArchiver archivedDataWithRootObject:self.myDictionary];
    [prefs setObject:data forKey:@"SavedOrders"];
    [prefs synchronize];
}
- (id)init
{
    self = [super init];
    if (self)
    {
        NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:@"SavedOrders"];
        self.myDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];

      }
    return self;
}

コードを少し試してみましたが、辞書を保存すると、ロードしたときと同じ135バイトでしたが、それでも辞書がいっぱいになりませんでした。だから私は途方に暮れています。

4

1 に答える 1

1

あなたのコードは良いようです。間違いが見つからないので、行を変更してみてください:

self.myDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];

id unknownObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"%@",[unknownObject class]);

@コンソールを見てください。出力が辞書になる場合は、キャストも試してみてください。したがって、これを次のように変更してみてください。

self.myDictionary = (NSDictionary*)[NSKeyedUnarchiver unarchiveObjectWithData:data];

編集

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"object1",@"key1",@"object2",@"key2",@"object3",@"key3", nil];
NSLog(@"before: %@",dictionary);
NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:dictionary];
NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData];
NSLog(@"after: %@",myDictionary);

出力:

2013-11-13 14:32:31.369 DemoM[175:60b] before: {
    key1 = object1;
    key2 = object2;
    key3 = object3;
}
2013-11-13 14:32:31.372 DemoM[175:60b] after: {
    key1 = object1;
    key2 = object2;
    key3 = object3;
}
于 2013-11-13T13:27:45.763 に答える