将NSTextView格式化文本转换为NSData(再转回去)

3

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

可以使用 textView.textStorage.string(其中 textView 是 NSTextView 对象)将文本转换为没有格式的纯文本。但是,我想保留文本的格式。

实际上我已经实现了一种方法,可以达到目的,但我不能确保它总是有效。我对 NSTextStorage 对象本身进行编码并写入文件,然后作为 NSAttributedString 对象读取回来。(NSTextStorageNSAttributedString 的子类)。我这样做是因为我不能直接设置 NSTextViewtextStorage 属性,但我可以设置其富文本字符串。

以下是我的代码(结果存储在 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对象,这种方法是否保证可行?


我认为没有问题。这似乎是一种完全有效的序列化方法。但是,“这是否是一个好方法?”这个问题有点主观,所以可能不是在这里询问的最好问题。 - Alexis King
谢谢 - 我已经编辑了最终问题,使其更客观。 - Racing Tadpole
1个回答

2

是的,这样做是可行的。 NSTextStorage 将使用 NSAttributedStringNSCoding 实现,因此当您对数据进行编码时,实际上将编码一个 NSAttributedString。这意味着您将读取数据作为不可变对象,即使您编写了一个可变对象。

显然,如果您使用 setAttributedString: 方法,那么使用编码后的不可变数据来更新可变状态就可以了。只要您的序列化/反序列化代码正确,这应该可以完美运行。


太好了,感谢解释。但是,NSTextStorage是否可以在现在或将来定义自己的NSCoding实现,从而打破这一点呢? - Racing Tadpole
@Radpole 不用担心,即使 NSTextStorage 定义了自己的实现(根据苹果文档目前并没有这样做),由于生成的类仍然扩展了 NSAttributedString,所有方法仍将正常工作。放心睡觉吧。 - Alexis King

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接