2010-11-24 138 views
21

我想将NSAttributedString存储到核心数据SQL存储。存储NSAttributedString核心数据

我把属性设置为“可变形”,它是可选的,它不是瞬态或索引,并且值转换器名称设置为默认“NSKeyedUnarchiveFromData”。在.xcdatamodel并产生一个具有这种在.H管理对象类:

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

,这在.M:

​​

我看穿,并设置“的.text”属性我的NSManagedObject的属性串的就完成,当我做:

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

这通过在输出导致此错误:

[NSCFType encodeWithCoder:]: 无法识别的选择发送到实例 0xc04edb0终止应用程序由于 未捕获的异常 'NSInvalidArgumentException' 的,原因: '* - [NSCFType encodeWithCoder:]: 无法识别的选择发送到实例 0xc04edb0'

我已经检查了类我所存储的财产,这是NSAttributedString也是我检查responsesToSelector @selector(:)并且这是违背这个返回true,所以很迷茫到错误消息?

请指教。

感谢 詹姆斯

+0

我曾经这样做过,但这是一个内存问题。尝试使用NSZombieEnabled = YES – Alfonso 2010-11-24 11:30:45

+0

运行应用程序我们已经启用了NSZombieEnabled。谢谢James – jodm 2010-11-24 11:33:21

+0

我是否需要有瞬态打勾?我在线上收到了冲突的消息? – jodm 2010-11-24 11:34:15

回答

6

我正在检查苹果开发者论坛,发现一个线程几乎和这个问题完全一样,一个人做了这个,但不幸的是没有共享代码。所有他们说的是以下几点:。

“在核心数据我有一个转变的数据库和我我们自己NSVauleTransformer这是NSValueTransformer一个子类,并从数据对象创建一个属性串和背部

因此我创建了一个叫PersistableAttributedString的类,这个类是NSCoding compliant。这个类有一个字符串和一个属性数组,并且构建了属性字符串,我还为可能的文本属性创建了一个类,它们是NSCoding兼容。全部为NSCoding兼容。

NSAttributedString也符合NSCoding,但属性不是,这就是问题所在。“

希望这可能有帮助。

-1

OK ......有的那种突破的通过虽然不是一个好...

如果我们的NSLog的属性串,然后我们可以看到在那里有NSFont和NSParagraphStyle在。虽然这些代码中不是NSFont和NSParagraphStyle,但它们是CTFontRef和段落样式的CT字典......这些不是NS对象,虽然在NSLog中它们输出为这些,因此猜测这就是为什么我们不能执行“encodeWithCoder”选择器在物体上。

如果在代码中我们只是做“NSFont”;编译器说“NSFont未声明”,所以我们可以做什么,因为我们只有CT功能?

正如我的同事在上面的评论中所说,如果我们将“.text”属性设置为“NSAttrinutedString * string = [NSAttributedString alloc] initWithString:@”test“],它可以很好地保存,如果我们将所有样式从我们希望一个保存它也可以!

必须有蓄光NSATTRIBUTED串式样融入到核心数据的方式...... NO?

任何想法不胜感激。

-JM

0

这是给你悲伤的字体 - CTDictionary是免费桥接到NSDictionary,它实现NSCoding所以应该编码罚款。

您可能需要处理的字体自己:( - 这里是做这件事的苏茨基方式

1)不是存储NSAttributedString的,打破它,并把每一个它的组件集成到一个数组。

2)通过数组 - 如果看到字体引用,则必须存储重新创建此字体所需的信息 - 查看CTFontCopyFontDescriptor函数,并使用CTFontDescriptorCopyAttribute函数让字体属性作为字符串。把所有这些放到一个应该存储在核心数据中的NSDictionary中。

3)将这个数组存储在核心数据中 - 希望数组中的所有项都符合NSCoding,所以你应该没问题。

...

要重新创建的字符串,当你从coredata加载,如果你看到一个NSDctionary代表字体属性,你应该能够重新创建fCTFontDescriptor,并从该字体。

然后,把你的弦放回去。

2

另一个想法是创建的NSAttributedString自定义类和地方使用enumerateAttributesInRange:options:usingBlock:来获取字符串的所有属性,然后保存NSDictionary与属性和范围,在以核心数据藏汉作为剥夺它的属性的属性串。

然后,当再次加载字符串时,可以使用initWithString:attributes:将字典中的属性应用于属性字符串。

11

对于任何人遇到这个问题,我发现最简单的解决方案:

在核心数据添加一个属性,我们称之为attributedText。然后将其类型定义为Transformable。在创建.h文件后,将数据类型attributedTextNSDictionary更改为NSAttributedString

现在您可以将NSAttributedString保存在核心数据中,无需修改。

回顾它是那么容易,因为要:

myObject.attributedText 

将返回你NSAttributedString

希望这可以帮助别人。