我正在尝试将 NSAttributedString 存储到核心数据 SQL 存储中。

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

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

这在 .m 中:

@dynamic Text;

我查看并将 NSManagedObject 的“.text”属性设置为属性字符串,然后完成后我会执行以下操作:

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

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

[NSCFTypeencodeWithCoder:]:由于未识别的选择器发送到实例0xC04EDB0终止应用程序,因为未被发现的异常“ nsinvalidargumentException”,原因:'* -[NSCFTypeencodeWithCoder:]:发送到实例的无法识别的选择器 0xc04edb0'

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

请指教。

谢谢 詹姆斯

有帮助吗?

解决方案

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

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

因此,我创建的类叫做PersistableAttributedStringNSCoding兼容。这个类有一个字符串和属性的数组,并构建归因字符串。我还创建了一个类可能的文本属性是NSCoding标准。字符串和属性一起都是NSCoding兼容。

NSAttributedStringNSCoding柔顺的,但属性不是,这就是问题所在。“

希望这可以帮助。

其他提示

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

在核心数据添加属性,让我们称之为attributedText。然后定义其类型为Transformable。创建.h文件后,attributedText的数据类型从NSDictionary改为NSAttributedString

现在可以保存在核心数据的NSAttributedString没有必要修改。

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

myObject.attributedText

这将返回你NSAttributedString

希望这可以帮助别人。

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

  1. 选择属性的名称并打开数据模型检查器(命令+选项+3)
  2. Attribute TypeTransformable
  3. Custom ClassNSAttributedString

Screenshot of Xcode attribute inspector

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

detailItem.content = textView.attributedText

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

那么当字符串被再次加载,你可以申请是在字典中使用initWithString:attributes:的属性串的属性。

这是一个的给你悲伤的字体 - 一个CTDictionary是免费电话桥接NSDictionary中,它实现NSCoding所以应该编码细

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

而不是存储在NSAttributedString的

1),把它分解,并把每个它的组件的成阵列。

2)经过阵列 - 如果你看到字体裁判必须只存储需要的信息重新创建这个字体 - 看看在CTFontCopyFontDescriptor功能和CTFontDescriptorCopyAttribute功能应该让你的字体属性为一个字符串。把所有这些成的NSDictionary应在核心数据存储细

3)在核心数据存储此数组 - 希望的阵列中的所有项目将NSCoding兼容所以你应该细

...

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

然后,把你的串到一起。

我发现了一种保存夫特4属性文本不使用的头文件。我的核心数据存储是由被称为“AttrNote”与“标题”和“说明”的属性的实体。 “头衔”的类型是“字符串”,而是“注意事项”的类型是“变形”。然后内,其中注入口/编辑完成我有以下视图控制器保存按钮:

@IBAction func saveBtn(_ sender: Any) {

var note: AttrNote!

//other code

if let title = titleTextField.text {
note.title = title
}
if let noteText = notesTextView.attributedText {
note.notes = noteText
}

和被称为加载数据的功能有以下:

func loadNoteData() {
if let note = noteToEdit {
titleTextField.text = note.title
notesTextView.attributedText = note.notes as! NSAttributedString
}
}

和我有以下在viewDidLoad中,其使得B / I / U格式化选项出现与文本的选择:

notesTextView.allowsEditingTextAttributes=true

我能保存属性文本,然后查看/编辑它以后。

OK ...某种类型的突破,通过虽然不是一个好...

如果我们的NSLog的属性串,然后我们可以看到在那里有NSFont和NSParagraphStyle中,虽然这些都不是NSFont和NSParagraphStyle在这些代码是CTFontRef和段落样式CT词典...这些都不是NS对象虽然在他们的NSLog输出,因为这些,所以想这就是为什么我们不能对对象执行的“encodeWithCoder”选择。

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

正如我的同事在上面,如果我们将“的.text”财产只是‘NSAttrinutedString *字符串= [NSAttributedString页头] initWithString:@’的评论说,测试“]它节省了罚款,如果我们从删除所有的造型一个我们要保存它也可以!

<强>必须有蓄光NSATTRIBUTED STRING WITH STYLING INTO CORE数据的方式...... NO吗

任何想法不胜感激。

-JM

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top