存储 NSAttributedString 核心数据
-
27-09-2019 - |
题
我正在尝试将 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
的一个子类,并创建一个从数据对象和背部的属性串。
因此,我创建的类叫做PersistableAttributedString
是NSCoding
兼容。这个类有一个字符串和属性的数组,并构建归因字符串。我还创建了一个类可能的文本属性是NSCoding
标准。字符串和属性一起都是NSCoding
兼容。
类NSAttributedString
也NSCoding
柔顺的,但属性不是,这就是问题所在。“
希望这可以帮助。
其他提示
有关任何人遇到这个问题,我发现的最简单的解决方案:
在核心数据添加属性,让我们称之为attributedText
。然后定义其类型为Transformable
。创建.h文件后,attributedText
的数据类型从NSDictionary
改为NSAttributedString
。
现在可以保存在核心数据的NSAttributedString
没有必要修改。
回顾它是那么容易,因为打算:
myObject.attributedText
这将返回你NSAttributedString
!
希望这可以帮助别人。
另一个想法是创建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