Pourquoi NSUserDefaults pu sauver NSMutableDictionary dans iOS?
J'aimerais enregistrer un NSMutableDictionary
objet dans NSUserDefaults
. Le type de clé dans NSMutableDictionary
est NSString
, le type de valeur est NSArray
, qui contient une liste d'objet qui implémente NSCoding
. Par document, NSString
et NSArray
les deux sont conformes à NSCoding
.
J'obtiens cette erreur:
[NSUserDefaults setObject: forKey:]: Tentative d'insertion de la non-valeur de la propriété.... de classe NSCFDictionary.
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé une alternative, avant de l'enregistrer, j'ai coder l'objet racine (
NSArray
objet) à l'aide deNSKeyedArchiver
, qui se termine avecNSData
. Ensuite, utilisez UserDefaults enregistrer leNSData
.Quand j'ai besoin de données, j'ai lu le
NSData
, et l'utilisationNSKeyedUnarchiver
pour convertirNSData
de revenir à l'objet.Il est un peu encombrant, parce que j'ai besoin de les convertir vers/à partir de
NSData
à chaque fois, mais il fonctionne, tout simplement.Ici est un exemple par la demande:
Enregistrer:
Charge:
L'élément dans le tableau met en œuvre
Puis dans la mise en œuvre de
CommentItem
, dispose de deux méthodes:Quelqu'un a une meilleure solution?
Merci à tous.
Si vous êtes à la sauvegarde d'un objet utilisateur, les valeurs par défaut, tous les objets, de manière récursive, tout en bas, doivent être des biens objets de la liste. Conforme à NSCoding ne veut rien dire ici--
NSUserDefaults
ne codez automatiquement dansNSData
, vous avez à faire vous-même. Si votre "liste d'objet qui implémenteNSCoding
" signifie que les objets qui ne sont pas des biens objets de la liste, alors vous aurez à faire quelque chose avec eux avant de les enregistrer à l'utilisateur par défaut.Pour info la liste des propriétés de classes sont
NSDictionary
,NSArray
,NSString
,NSDate
,NSData
, etNSNumber
. Vous pouvez écrire mutable sous-classes (commeNSMutableDictionary
) les préférences de l'utilisateur, mais les objets que vous avez lu, toujours immuable.Sont tous de vos mots-clés dans le dictionnaire
NSString
s? Je pense qu'ils doivent être dans l'ordre pour enregistrer le dictionnaire à une liste de propriétés.Réponse La Plus Simple :
NSDictionary
n'est qu'un plist objet , si le clés sont NSStrings.Donc, Stocker les "Clé" comme
NSString
avecstringWithFormat
.Solution :
Avantages :
NULL
.Avez-vous pensé à la mise en œuvre de la
NSCoding
Protocole? Cela vous permettra d'encoder et de décoder sur l'iPhone avec deux méthodes simples qui sont mis en œuvre avec laNSCoding
. D'abord, vous devrez ajouter leNSCoding
à votre Classe.Voici un exemple:
C'est dans l' .h fichier
Alors vous aurez besoin de mettre en œuvre deux méthodes de la NSCoding Protocole.
Consultez la documentation sur NSCoder pour plus d'informations. Qui est venu vraiment pratique pour mes projets où j'ai besoin de sauvegarder l'état de l'application sur l'iPhone si l'application est fermée et de le restaurer à son état lors de son retour sur.
La clé est d'ajouter le protocole de l'interface, puis de mettre en œuvre les deux méthodes qui font partie de
NSCoding
.J'espère que cela aide!
Il n'y a pas de meilleure solution. Une autre option serait de simplement enregistrer le code d'objet sur le disque - mais qui est en train de faire la même chose. Ils ont tous les deux jusqu'à la fin avec NSData qui obtient décodé quand vous le voulez à nouveau.