217 votes

Essayez de définir un objet non-propriété-liste comme un NSUserDefaults

Je pensais que je savais ce qui était la cause de cette erreur, mais je n'arrive pas à comprendre ce que je fait de mal.

Voici l'intégralité du message d'erreur que j'obtiens:

Tentative de définition d'une non-propriété des objets de la liste (
 "<BC_Person: 0x8f3c140>"
) comme un NSUserDefaults valeur pour la clé personDataArray

J'ai un Person de la classe qui, je pense, est conforme à l' NSCoding protocole, où j'ai à la fois de ces méthodes dans ma classe personne:

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:self.personsName forKey:@"BCPersonsName"];
    [coder encodeObject:self.personsBills forKey:@"BCPersonsBillsArray"];
}

- (id)initWithCoder:(NSCoder *)coder {
    self = [super init];
    if (self) {
        self.personsName = [coder decodeObjectForKey:@"BCPersonsName"];
        self.personsBills = [coder decodeObjectForKey:@"BCPersonsBillsArray"];
    }
    return self;
}

À un certain moment dans l'application, l' NSString dans la BC_PersonClass est réglé, et j'ai un DataSave de la classe qui, je pense, est de la manipulation de l'encodage des propriétés dans mon BC_PersonClass. Voici le code, je suis à l'aide de l' DataSave classe:

- (void)savePersonArrayData:(BC_Person *)personObject
{
   // NSLog(@"name of the person %@", personObject.personsName);

    [mutableDataArray addObject:personObject];

    // set the temp array to the mutableData array
    tempMuteArray = [NSMutableArray arrayWithArray:mutableDataArray];

    // save the person object as nsData
    NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];

    // first add the person object to the mutable array
    [tempMuteArray addObject:personEncodedObject];

    // NSLog(@"Objects in the array %lu", (unsigned long)mutableDataArray.count);

    // now we set that data array to the mutable array for saving
    dataArray = [[NSArray alloc] initWithArray:mutableDataArray];
    //dataArray = [NSArray arrayWithArray:mutableDataArray];

    // save the object to NS User Defaults
    NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
    [userData setObject:dataArray forKey:@"personDataArray"];
    [userData synchronize];
}

J'espère que c'est assez de code pour vous donner une idée de l'o ce que je suis en train de faire. Encore une fois je sais que mon problème se situent à la façon dont je suis l'encodage de mes propriétés dans mon BC_Person de classe, je n'arrive pas à comprendre ce que si je fais mal.

Merci pour l'aide!

285voto

rmaddy Points 79279

Le code que vous avez posté tente d'enregistrer un tableau d'objets personnalisés pour NSUserDefaults. Vous ne pouvez pas le faire. La mise en œuvre de l' NSCoding méthodes n'aide pas. Vous ne pouvez stocker des choses comme NSArray, NSDictionary, NSString, NSData, NSNumber, et NSDate dans `NSUserDefaults.

Vous avez besoin de convertir l'objet d' NSData (comme vous l'avez dans le code) et les conserver NSData en NSUserDefaults. Vous pouvez même stocker NSArray de NSData si vous en avez besoin.

Lorsque vous relisez le tableau vous avez besoin pour désarchiver l' NSData pour revenir à l' BC_Person objets.

Vous désirez peut-être ceci:

- (void)savePersonArrayData:(BC_Person *)personObject {
    [mutableDataArray addObject:personObject];

    NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:mutableDataArray.count];
    for (BC_Person *personObject in mutableDataArray) { 
        NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];
        [archiveArray addObject:personEncodedObject];
    }

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X