存储NSAttributedString核心数据
我想将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,所以很迷茫到错误消息?
请指教。
感谢 詹姆斯
我正在检查苹果开发者论坛,发现一个线程几乎和这个问题完全一样,一个人做了这个,但不幸的是没有共享代码。所有他们说的是以下几点:。
“在核心数据我有一个转变的数据库和我我们自己NSVauleTransformer这是NSValueTransformer
一个子类,并从数据对象创建一个属性串和背部
因此我创建了一个叫PersistableAttributedString
的类,这个类是NSCoding
compliant。这个类有一个字符串和一个属性数组,并且构建了属性字符串,我还为可能的文本属性创建了一个类,它们是NSCoding
兼容。全部为NSCoding
兼容。
类NSAttributedString
也符合NSCoding
,但属性不是,这就是问题所在。“
希望这可能有帮助。
OK ......有的那种突破的通过虽然不是一个好...
如果我们的NSLog的属性串,然后我们可以看到在那里有NSFont和NSParagraphStyle在。虽然这些代码中不是NSFont和NSParagraphStyle,但它们是CTFontRef和段落样式的CT字典......这些不是NS对象,虽然在NSLog中它们输出为这些,因此猜测这就是为什么我们不能执行“encodeWithCoder”选择器在物体上。
如果在代码中我们只是做“NSFont”;编译器说“NSFont未声明”,所以我们可以做什么,因为我们只有CT功能?
正如我的同事在上面的评论中所说,如果我们将“.text”属性设置为“NSAttrinutedString * string = [NSAttributedString alloc] initWithString:@”test“],它可以很好地保存,如果我们将所有样式从我们希望一个保存它也可以!
必须有蓄光NSATTRIBUTED串式样融入到核心数据的方式...... NO?
任何想法不胜感激。
-JM
这是给你悲伤的字体 - CTDictionary是免费桥接到NSDictionary,它实现NSCoding所以应该编码罚款。
您可能需要处理的字体自己:( - 这里是做这件事的苏茨基方式
1)不是存储NSAttributedString的,打破它,并把每一个它的组件集成到一个数组。
2)通过数组 - 如果看到字体引用,则必须存储重新创建此字体所需的信息 - 查看CTFontCopyFontDescriptor函数,并使用CTFontDescriptorCopyAttribute函数让字体属性作为字符串。把所有这些放到一个应该存储在核心数据中的NSDictionary中。
3)将这个数组存储在核心数据中 - 希望数组中的所有项都符合NSCoding,所以你应该没问题。
...
要重新创建的字符串,当你从coredata加载,如果你看到一个NSDctionary代表字体属性,你应该能够重新创建fCTFontDescriptor,并从该字体。
然后,把你的弦放回去。
另一个想法是创建的NSAttributedString
自定义类和地方使用enumerateAttributesInRange:options:usingBlock:
来获取字符串的所有属性,然后保存NSDictionary
与属性和范围,在以核心数据藏汉作为剥夺它的属性的属性串。
然后,当再次加载字符串时,可以使用initWithString:attributes:
将字典中的属性应用于属性字符串。
对于任何人遇到这个问题,我发现最简单的解决方案:
在核心数据添加一个属性,我们称之为attributedText
。然后将其类型定义为Transformable
。在创建.h文件后,将数据类型attributedText
从NSDictionary
更改为NSAttributedString
。
现在您可以将NSAttributedString
保存在核心数据中,无需修改。
回顾它是那么容易,因为要:
myObject.attributedText
将返回你NSAttributedString
!
希望这可以帮助别人。
我曾经这样做过,但这是一个内存问题。尝试使用NSZombieEnabled = YES – Alfonso 2010-11-24 11:30:45
运行应用程序我们已经启用了NSZombieEnabled。谢谢James – jodm 2010-11-24 11:33:21
我是否需要有瞬态打勾?我在线上收到了冲突的消息? – jodm 2010-11-24 11:34:15