2010-11-24 10 views
21

J'essaie de stocker une chaîne NSAttributedString dans un magasin SQL de données de base.Stockage des données de base NSAttributedString

J'ai la propriété définie comme "transformable", elle est facultative et elle n'est PAS transitoire ou indexée et le nom du transformateur de valeur est défini par défaut "NSKeyedUnarchiveFromData". Dans le .xcdatamodel et généré la classe d'objet géré qui a ceci dans le .h:

@property (nonatomic, retain) id Text; (I have tried changing id to NSAttributedString *Text) 

et ce dans le .m:

@dynamic Text; 

je regarde à travers et définir la propriété « .text » de mon NSManagedObject à la chaîne attribuée alors une fois rempli que je fais:

NSError *error = nil; 
[managedObjectContext save:&error]; 

ce travers est à l'origine de cette erreur dans la sortie:

[NSCFType encodeWithCoder:]: sélecteur non reconnu envoyé à l'instance 0xc04edb0 Mettre fin app due à exception uncaught 'NSInvalidArgumentException', raison: '* - [NSCFType encodeWithCoder:]: sélecteur non reconnu envoyé à l'instance 0xc04edb0'

J'ai vérifié la classe de ce que je stocke à la propriété et il est NSAttributedString aussi je vérifie responsesToSelector @selector(:) et cela renvoie vrai si très confus car cela est contraire au message d'erreur?

Veuillez nous aviser.

Merci James

+0

J'avais ceci avant, mais c'était un problème de mémoire. Essayez d'exécuter l'application avec NSZombieEnabled = YES – Alfonso

+0

NSZombieEnabled est déjà activé. Merci James – jodm

+0

Ai-je besoin d'avoir cochée transitoire? Je reçois des messages contradictoires en ligne? – jodm

Répondre

6

Je vérifiais les Apple Developer Forums et trouvé un fil presque identique à cette question, une personne l'avait fait mais malheureusement n'a pas partagé le code. Tout ce qu'ils ont dit était la suivante:..

« Dans Core Data j'ai un transformables dans la base de données et nous i mon NSVauleTransformer C'est une sous-classe de NSValueTransformer et crée une chaîne attribuée à partir de l'objet de données et à l'arrière

Par conséquent j'ai créé une classe appelée PersistableAttributedString qui est NSCoding conforme.Cette classe a une chaîne et un tableau d'attributs et construit la chaîne attribuée.J'ai également créé une classe pour les attributs de texte possibles qui est conforme à NSCoding. Ensemble la chaîne et les attributs sont tous conformes NSCoding

La classe NSAttributedString est également conforme à NSCoding, mais les attributs ne le sont pas, c'est le problème. "

Espérons que cela pourrait aider.

+1

peut-être un lien vers ce fil. ... – deanWombourne

+3

https://devforums.apple.com/message/308862 # 308862 – Joshua

+0

Ce fil a maintenant une réponse à cette question. – Joshua

-1

OK ... Une sorte de pause dans mais pas un bon ...

Si nous NSLog la chaîne attribué alors nous pouvons voir là-dedans, il a NSFont et NSParagraphStyle dans Bien que ce ne soient PAS NSFont et NSParagraphStyle dans le code ce sont des CTFontRef et CT Dictionnaires de styles de paragraphe ... Ce ne sont pas des objets NS bien que dans NSLog ils sortent comme ceci et devinent donc pourquoi on ne peut pas faire le sélecteur "encodeWithCoder" sur l'objet. SI dans le code, nous faisons juste "NSFont;" le compilateur dit "NSFont non déclaré" alors que pouvons-nous faire comme nous avons seulement les fonctions CT? Comme mon collègue a dit dans les commentaires ci-dessus si nous définissons la propriété ".text" à juste "NSAttrinutedString * chaîne = [NSAttributedString alloc] initWithString: @" test "] il enregistre très bien et si nous supprimons tout le style de celui que nous voulons pour le sauver fonctionne aussi!

iL DOIT Y AVOIR uN MODE dE STOCKER STRING NSATTRIBUTED AVEC COIFFURE eN DONNÉES dE BASE ... NON?

Toutes les idées très appréciées.

-JM

0

C'est la police qui vous donne du chagrin - un CTDictionary est relié gratuitement à NSDictionary qui implémente NSCoding, donc devrait bien encoder.

Vous pourriez avoir à traiter avec la police vous-même :(- voici une façon sucky de le faire

1) Au lieu de stocker le NSAttributedString, le décomposer et de mettre chacun ses composants dans un tableau.. 2) Parcourez le tableau - si vous voyez la police ref, vous devez stocker uniquement les informations nécessaires pour recréer cette police - jetez un oeil à la fonction CTFontCopyFontDescriptor et la fonction CTFontDescriptorCopyAttribute devrait vous permettre d'obtenir des attributs de police sous la forme d'une chaîne . Mettez tout cela dans un NSDictionary qui devrait bien stocker dans les données de base.

3) Stockez cette matrice dans les données de base - nous espérons que tous les éléments de la matrice seront compatibles NSCoding, donc cela devrait aller.

...

Pour recréer votre chaîne, lorsque vous chargez de CoreData, si vous voyez une NSDctionary police représentant vous attribue devriez être en mesure de recréer le fCTFontDescriptor et de celle de la police.

Ensuite, remettez votre chaîne en place.

+0

Puis-je demander pourquoi NSFont cause du chagrin, quand il implémente NSCoding? Malheureusement, cela cause aussi des problèmes avec NSParagraphStyle, donc cela ne semble pas être seulement la police qui cause le chagrin. – jowie

+0

La principale raison pour laquelle nous voulions stocker la chaîne attribuée à Core Data était que nous n'avions pas besoin de ré-analyser quoi que ce soit en la retirant de la base de données. Nous avons pensé à cette option plus tôt car il n'y a que 8 paragraphes de style unique comme nous le pensons à propos des dictionnaires de styles. Si vous devez re = analyser en sortie alors il n'y a pas de point et nous pouvons aussi juste analyser chaque fois ...: o ( – jodm

+0

Ouais désolé oublié de dire et d'ajouter au point @ joe ... La première chose qu'il trouve est un paragraphe et il se bloque sur cela aussi: O ( – jodm

2

Une autre idée serait de créer une classe personnalisée de NSAttributedString et utiliser quelque part enumerateAttributesInRange:options:usingBlock: pour obtenir tous les attributs de la chaîne, puis enregistrez le NSDictionary avec les attributs et les gammes pour Core Data aswell comme la chaîne attribuée dépouillé de ses attributs .

Ensuite, lorsque la chaîne est chargée à nouveau, vous pouvez appliquer les attributs qui se trouvent dans le dictionnaire à la chaîne attribuée en utilisant initWithString:attributes:.

11

Pour tous ceux qui connaissent ce problème, je trouve la solution la plus simple:

Dans ajouter Core Data un attribut, appelons-le attributedText. Puis définissez son type comme Transformable. Après avoir créé le fichier .h, modifiez le type de données de attributedText de NSDictionary à NSAttributedString.

Maintenant, vous pouvez enregistrer le NSAttributedString dans Core Data sans modification nécessaire.

il est aussi Rappelant facile que d'aller:

myObject.attributedText 

qui retournera votre NSAttributedString!

Espérons que cela aide quelqu'un.

+0

Cela ne résout pas le problème des attributs n'étant pas compatibles NSCoding – Berik

+0

Cela m'a aidé à ajouter une chaîne NSAttributedString aux données de base et semble fonctionner correctement. En rapide aussi. Merci! (Je n'utilise pas NSCoding si) – yuzer

+0

@yuzer, cela vous dérange-t-il de partager sur l'équivalent rapide? – Craneum

Questions connexes