1

Ich versuche, ein benutzerdefiniertes Objekt wie folgt zu speichern, aber ich erhalte einen Fehler.Speichern Sie benutzerdefinierte Objekte in NSUserDefaults

// store data 
NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:pOrderElements.count]; 
for (id orderObject in pOrderElements) { 
    NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:orderObject]; 
    [archiveArray addObject:personEncodedObject]; 
} 

NSUserDefaults *userData = [NSUserDefaults standardUserDefaults]; 
[userData setObject:archiveArray forKey:@"personDataArray"]; 


// retrive data 
NSData *data = [userData objectForKey:@"personDataArray"]; 
// the following line throws an error 
id retrieveData = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

hier ist mein pOrderElements

(lldb) po pOrderElements 
<__NSArrayM 0x174256b90>(
{ 
    category = 1; 
    imagePath = "products/chicken-kabob.png"; 
    name = "Baked Chicken"; 
    price = "5.49"; 
} 
) 

app aufgrund nicht abgefangene Ausnahme Abschluss 'NSInvalidArgumentException', Grund: '- [__ NSCFArray Bytes]: Unbekannter Selektor zum Beispiel 0x174264f40 gesendet'

+2

Möglichen Duplikat von [Wie benutzerdefinierte speichern Objekten in NSUserDefaults] (http://stackoverflow.com/questions/2315948/how-to-store-custom-objects- in-nsuserdefaults) –

+0

Ich bezog sich auf folgende Antwort, aber ich habe den Fehler http://StackOverflow.com/questions/19720611/attempt-to-set-a-non-property-list-object-as-an-nsuserdefaults – hotspring

+0

Haben Sie einen Encoder-Decoder implementiert? –

Antwort

2

Sie archivieren inkorrektes Objekt. Sie speichern NSArray zu NSUserDefaults

NSArray * archiveArray = [userData objectForKey:@"personDataArray"]; 
for (NSData *personEncodedObject in archiveArray) { 
    id personObject = [NSKeyedUnarchiver unarchiveObjectWithData:personEncodedObject]; 
} 
1

Zuerst erstellen Sie benutzerdefinierte Klasse wie unten.

CustomObject.h

#import <Foundation/Foundation.h> 

@interface CustomObject : NSObject 

@property(strong,nonatomic)NSString *name; 

@end 

CustomObject.m

#import "CustomObject.h" 

@implementation CustomObject 



- (void)encodeWithCoder:(NSCoder *)encoder { 
    //Encode properties, other class variables, etc 
    [encoder encodeObject:self.name forKey:@"name"]; 

} 

- (id)initWithCoder:(NSCoder *)decoder { 
    if((self = [super init])) { 
     //decode properties, other class vars 
     self.name = [decoder decodeObjectForKey:@"name"]; 

    } 
    return self; 
} 

erstellen Dann CustomObject Klassenobjekt und Speicher in NSUserDefaults

Stored Ihr Objekt wie dieses

CustomObject *object =[CustomObject new]; 
object.name = @"test"; 

NSMutableArray *arr = [[NSMutableArray alloc]init]; 
[arr addObject:object]; 

NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:arr]; 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:encodedObject forKey:@"storeObject"]; 
[defaults synchronize]; 

erhalten benutzerdefiniertes Objekt aus NSUserDefaults wie dieses

NSData *storedEncodedObject = [defaults objectForKey:@"storeObject"]; 
    NSArray *arrStoreObject = [NSKeyedUnarchiver unarchiveObjectWithData:storedEncodedObject]; 
    for (int i=0; i<arrStoreObject.count; i++) 
    { 
     CustomObject *storedObject = [arrStoreObject objectAtIndex:i]; 
     NSLog(@"%@",storedObject.name); 

    } 
+0

Es funktioniert für Sie oder nicht. Bitte sagen Sie mir @ Hotspring –

Verwandte Themen