2010-11-24 3 views
21

Я пытаюсь сохранить NSAttributedString в хранилище SQL Core Data.Хранение данных ядра NSAttributedString

У меня есть свойство, заданное как «трансформируемое», оно является необязательным и оно не является переходным или индексированным, а для имени преобразователя значения установлено значение по умолчанию «NSKeyedUnarchiveFromData». В .xcdatamodel и генерируется управляемый класс объекта, который имеет это в .h:

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

и это в .m:

@dynamic Text; 

просматриваю и установить свойство «.text» мой NSManagedObject к приписываемой строке тогда, когда завершено я:

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

Это вызывает через эту ошибку на выходе:

[NSCFType encodeWithCoder]: непризнанная селектор послана к экземпляру 0xc04edb0 Согласующему приложение из-за неперехваченного исключением 'NSInvalidArgumentException', причина: '* - [NSCFType encodeWithCoder]: непризнанной селектор послана к экземпляру 0xc04edb0'

Я проверил класс, что я храню в собственность, и это NSAttributedString также проверить responsesToSelector @selector(:) и это возвращает истину, так очень смущен, так как это противоречит к сообщению об ошибке?

Просьба сообщить.

Благодаря Джеймс

+0

У меня было это раньше, но это была проблема с памятью. Попробуйте запустить приложение с NSZombieEnabled = YES – Alfonso 2010-11-24 11:30:45

+0

У нас уже есть NSZombieEnabled. Спасибо Джеймс – jodm 2010-11-24 11:33:21

+0

Должен ли я иметь переходный период? Я получаю противоречивые сообщения в Интернете? – jodm 2010-11-24 11:34:15

ответ

6

Я проверял Форумы разработчиков Apple и нашел тему почти точно так же, как этот вопрос, один человек сделал это, но, к сожалению, не разделил код. Все они сказали, были следующим:..

«В основных данных я иметь трансформируемый в базе данных и я нам моя NSVauleTransformer Это подкласс NSValueTransformer и создает приписываемую строку из объекта данных и обратно

Поэтому я создал класс с именем PersistableAttributedString, который соответствует NSCoding.Этот класс имеет строку и массив атрибутов и строит присваиваемую строку. Я также создал класс для возможных текстовых атрибутов, который соответствует NSCoding. Вместе строка и атрибуты все являются NSCoding.

Класс NSAttributedString также соответствует NSCoding, но атрибутов нет, это проблема. "

Надеюсь, что это поможет.

-1

КИ ... Какое-то прорыв, хотя и не хороший ...

Если мы NSLog приписанный строка, то мы можем увидеть там она имеет NSFont и NSParagraphStyle в Хотя они не являются NSFont и NSParagraphStyle в коде, это CTFontRef и CT словари стилей абзацев ... Это не NS-объекты, хотя в NSLog они выводятся как они, и поэтому угадывают, поэтому мы не можем выполнить селектор «encodeWithCoder» на объект.

ЕСЛИ в коде мы просто делаем «NSFont;» компилятор говорит «NSFont uneclared», так что мы можем сделать, поскольку у нас есть только функции CT?

Как мой коллега сказал в комментариях выше, если мы установили свойство «.text» как «NSAttrinutedString» string = [NSAttributedString alloc] initWithString: @ «test»], это сэкономит штраф, и если мы удалим все стили из который мы хотим, чтобы сохранить это работает!

ДОЛЖЕН БЫТЬ ПУТЬ сОХРАНЕНИЯ NSATTRIBUTED STRING с укладкой INTO CORE ДАННЫХ ... НЕТ?

Любые идеи с благодарностью.

-JM

0

Это шрифт, который дает вам печаль - CTDictionary является бесплатным мостом в NSDictionary, который реализует NSCoding, поэтому он должен кодировать в порядке.

Вы можете иметь дело с шрифтом самих :(- вот Sucky способа сделать это

1) Вместо того чтобы хранить NSAttributedString, разбить его и положить каждый из его компонентов в массив..

2) Пройдите через массив - если вы видите шрифт ref, вы должны сохранить только информацию, необходимую для воссоздания этого шрифта, - посмотрите на функцию CTFontCopyFontDescriptor, а функция CTFontDescriptorCopyAttribute должна позволить вам получить атрибуты шрифта в виде строки , Поместите все это в NSDictionary, который должен хранить в основных данных в порядке.

3) Храните этот массив в основных данных - мы надеемся, что все элементы массива будут совместимы с NSCoding, поэтому вы должны быть в порядке.

...

Чтобы обновить вашу строку, при загрузке из CoreData, если вы видите, представляющий шрифт NSDctionary атрибуты должны быть в состоянии воссоздать fCTFontDescriptor и от этого шрифта.

Затем верните свою линию вместе.

2

Другая идея была бы создать специальный класс из NSAttributedString и где использовать enumerateAttributesInRange:options:usingBlock:, чтобы получить все атрибуты строки, а затем сохранить NSDictionary с атрибутами и диапазоны, чтобы Core Data как хорошо, как приписанный строки лишенного это атрибуты ,

Затем, когда строка загружается снова, вы можете применить атрибуты, которые находятся в словаре, к атрибутной строке, используя initWithString:attributes:.

11

Для тех, кто испытывает эту проблему, я нашел простое решение:

В Core Data добавить атрибут, давайте назовем его attributedText. Затем определите его тип как Transformable. После создания файла .h, измените тип данных attributedText с NSDictionary на NSAttributedString.

Теперь вы можете сохранить NSAttributedString в Core Data без каких-либо изменений.

ссылаясь на то, как легко, как происходит:

myObject.attributedText 

который вернет ваш NSAttributedString!

Надеюсь, это поможет кому-то.

Смежные вопросы