存储NSAttributedString核心数据

jod*_*odm 22 iphone core-data objective-c nsattributedstring

我试图将NSAttributedString存储到Core Data SQL存储.

我将属性设置为"可转换",它是可选的,它不是瞬态的或索引的,并且值转换器名称设置为默认值"NSKeyedUnarchiveFromData".在.xcdatamodel中并生成在.h中具有此内容的托管对象类:

@property (nonatomic, retain) id Text; (I have tried changing id to NSAttributedString *Text)
Run Code Online (Sandbox Code Playgroud)

这在.m中:

@dynamic Text;
Run Code Online (Sandbox Code Playgroud)

我查看并将我的NSManagedObject的".text"属性设置为属性字符串,然后在完成时执行:

NSError *error = nil;
[managedObjectContext save:&error];
Run Code Online (Sandbox Code Playgroud)

此过程导致输出中出现此错误:

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

我已经检查了我存储到属性的类的类,它NSAttributedString也是我检查responsesToSelector @selector(:)并返回true,所以非常困惑,因为这与错误消息相反?

请指教.

谢谢詹姆斯

pob*_*b21 11

对于遇到此问题的任何人,我找到了最简单的解决方案:

在Core Data中添加一个属性,让我们调用它 attributedText.然后将其类型定义为Transformable.创建.h文件后,将attributedTextfrom 的数据类型更改NSDictionaryNSAttributedString.

现在您可以保存NSAttributedString核心数据而无需进行任何修改.

回顾它就像去一样容易:

myObject.attributedText
Run Code Online (Sandbox Code Playgroud)

这将返回你的NSAttributedString!

希望这有助于某人.


Jos*_*hua 6

我正在检查Apple开发者论坛,并发现一个与此问题几乎完全相同的主题,一个人已经这样做但很遗憾没有共享代码.他们所说的只是以下内容:

"在核心数据中,我在数据库中有一个可转换的,我是我自己的NSVauleTransformer.这是一个子类,NSValueTransformer并从数据对象和后面创建一个属性字符串.

因此,我创建了一个名为类PersistableAttributedStringNSCoding兼容的.此类具有字符串和属性数组,并构建属性字符串.我还为NSCoding符合条件的可能文本属性创建了一个类.字符串和属性一起都是NSCoding兼容的.

该类NSAttributedString也是NSCoding合规的,但属性不是,这就是问题所在."

希望可能有所帮助.


rod*_*han 6

在具有自动代码生成功能的 Xcode 10 中,这比其他建议简单得多。

  1. 选择属性的名称,打开数据模型检查(Command+ Option+ 3
  2. 设置Attribute TypeTransformable
  3. 设置Custom ClassNSAttributedString

Xcode 属性检查器的屏幕截图

就是这样,现在您可以按照预期将数据保存在 Swift 代码中,例如:

detailItem.content = textView.attributedText