将NSTextView格式的文本转换为NSData(并返回)

时间:2012-06-25 04:22:03

标签: objective-c nsdata nstextview nsattributedstring nstextstorage

如何将NSTextView的内容转换为NSData,然后将其转换回来并在Mac OS X上显示?

我可以使用textView.textStorage.string(其中textView是NSTextView对象)转换文本而不进行格式化。但是,我也希望保存文本格式。

事实上,我已经实施了一种有效的方法,但我不确定它是否始终有效。我对NSTextStorage对象本身进行编码并编写它,然后将其作为NSAttributedString读回。 (NSTextStorageNSAttributedString的子类。)我这样做是因为我无法直接为textStorage设置NSTextView,但我可以设置其属性字符串。

这是我的代码转换它(结果在data):

NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];          
[archiver encodeObject:textView.textStorage forKey:@"attrs"];
[archiver finishEncoding];

要读回来:

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSAttributedString* theAttrString = [unarchiver decodeObjectForKey:@"attrs"];
[unarchiver finishDecoding];

并显示它:

[textView.textStorage setAttributedString:theAttrString];

这种方法是否可以保证有效,因为我对NSTextStorage对象进行编码并将其读回来将其解释为NSAttributedString

1 个答案:

答案 0 :(得分:2)

是的,这会有效。 NSTextStorage将使用NSCoding的{​​{1}}实现,因此在对数据进行编码时,您实际上将对NSAttributedString进行编码。这意味着即使您编写了一个可变对象,也会将数据作为不可变对象读回。

显然,如果你使用NSAttributedString方法,这很好,所以你将使用编码的不可变数据来更新可变状态。只要你的序列化/反序列化代码是正确的,这应该完美无缺。