【问题标题】:Converting NSTextView formatted text to NSData (and back)将 NSTextView 格式的文本转换为 NSData(并返回)
【发布时间】:2012-06-25 04:22:03
【问题描述】:

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

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

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

这是我的转换代码(结果在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,这种方法是否保证有效?

【问题讨论】:

  • 我不明白为什么不这样做。这似乎是一种完全有效的序列化方法。然而,问题是“这是一个好方法吗?”有点主观,所以这里可能不是最好的问题。
  • 谢谢 - 我已经编辑了最后一个问题以减少主观性。

标签: objective-c nsdata nstextview nsattributedstring nstextstorage


【解决方案1】:

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

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

【讨论】:

  • 太好了,感谢您的解释。但是 NSTextStorage 是否可以定义自己的 NSCoding 实现来打破这一点,现在还是将来?
  • @Radpole 不,即使 NSTextStorage 定义了自己的实现(根据 Apple 文档,它目前没有),因为生成的类仍然扩展 NSAttributedString,所有方法都会仍然正常工作。睡个好觉。
猜你喜欢
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 2015-10-11
  • 2013-11-29
  • 2012-01-11
  • 1970-01-01
相关资源
最近更新 更多