将NSAttributedString转换为字符串并返回

Mic*_*ník 7 cocoa objective-c nsstring nsattributedstring

我有NSString,我需要制作NSAttributedString.

NSString是这样的:

bvcx b vcxbcvx bcxvbcxv bvx xbc bcvx bxcv bcxv bcxv bcxv bcvx bcvx bcxvbcvx bvc bcvx bxcv{
NSFont = "\"LucidaGrande 24.00 pt. P [] (0x108768a80) fobj=0x108788880, spc=7.59\"";
NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n    28L,\n    56L,\n    84L,\n    112L,\n    140L,\n    168L,\n    196L,\n    224L,\n    252L,\n    280L,\n    308L,\n    336L\n), DefaultTabInterval 0, Blocks (null), Lists (null), BaseWritingDirection -1, HyphenationFactor 0, TighteningFactor 0.05, HeaderLevel 0";
}
Run Code Online (Sandbox Code Playgroud)

它是UTF-8中的NSAttributedString.有什么方法可以做到吗?

rob*_*off 9

你说你是从这样的现有创建输入字符串NSAttributedString:

[NSString stringWithFormat:@"%@", nsattributedstring]
Run Code Online (Sandbox Code Playgroud)

%@格式说明发送description消息给nsattributedstring对象.该description方法的目的不是生成可以轻松转换回NSAttributedString对象的字符串.它旨在帮助程序员调试他们的代码.

将对象转换为字符串或字节数组以便以后可以将其转换回对象的过程称为序列化.使用%@或该description方法通常不是执行序列化的好方法.如果您确实要反序列化该description方法创建的字符串,则必须编写自己的解析器.据我所知,没有API.

相反,Cocoa提供了一个用于序列化和反序列化对象的系统.可以使用此系统序列化的对象符合NSCoding协议.NSAttributedString对象符合NSCoding.因此,请尝试以这种方式序列化原始属性字符串:

NSMutableData *data = [NSKeyedArchiver archivedDataWithRootObject:nsattributedstring];
Run Code Online (Sandbox Code Playgroud)

data在任何需要的地方保存(这是非人类可读的二进制文件,而不是UTF-8).当您需要重新创建属性字符串时,请执行以下操作:

NSAttributedString *fancyText = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Run Code Online (Sandbox Code Playgroud)

如果您正在为OS X(而不是 iOS)编程,那么您有另一种选择.您可以使用RTFFromRange:documentAttributes:方法(省略附件)或RTFDFromRange:documentAttributes:方法(包括附件)将属性字符串转换为RTF(富文本格式),这是人类可读的.然后,您可以使用initWithRTF:documentAttributes:或将RTF数据转换回属性字符串initWithRTFD:documentAttributes:.这些方法在iOS上不可用.

如果您使用的是iOS 7.0或更高版本的编程,则可以使用-dataFromRange:documentAttributes:error:fileWrapperFromRange:documentAttributes:error:将属性字符串转换为RTF/RTFD.您需要设置NSDocumentTypeDocumentAttributeNSRTFTextDocumentTypeNSRTFDTextDocumentType文档属性.使用initWithData:options:documentAttributes:error:initWithFileURL:options:documentAttributes:error:转换回NSAttributedString.这些方法是NSAttributedString UIKit Additions的一部分.