Swift读取RTF文件不适用于标签

时间:2018-01-19 07:44:43

标签: ios swift swift4 nsattributedstring rtf

我正在读取一个rtf文件,但输出结果显示包含标签的简单字符串,它不会显示为NSAttributedString,因为它应该 这是我的代码

if let rtfPath = Bundle.main.url(forResource: "SampleHTML", withExtension: "rtf") {
     do {
          let attributedStringWithRtf: NSAttributedString = 
          try NSAttributedString(url: rtfPath, options: [NSAttributedString.DocumentReadingOptionKey.documentType:
          NSAttributedString.DocumentType.rtf], documentAttributes: nil)
        }catch let error {
            print("Got an error \(error)")
        }
}

在读取文件后,它将属性字符串显示为:
< p> em>查看以下信息。然后选择最佳答案并单击<强>提交< /强取代。回答后,点击< strong>下一个问题< /强>继续前进。< / EM>< / p为H. 。
    我在标签中插入空格以澄清问题,没有空格StackOverflow将标签应用于文本,我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

在您获得RTF到NSAttributedString之后(您可以使用SO的代码标记来避免解释HTML标记):

<p><em>Review the following information. Then select the best answer and click <strong>Submit</strong>. After answering, click <strong>Next Question</strong> to move forward.</em></p>

现在,您有一个HTML AttributedString 和RTF一样,有一种方法可以从HTML字符串中获取NSAttributedString。 因此,让我们首先获得HTML字符串:let htmlString = attributedStringWithRtf.string 对于其他方法,该方法与使用的方法几乎相同,更改为:NSAttributedString.DocumentType.html而不是NSAttributedString.DocumentType.rtf(似乎很明显),并且有一个带data的init而不是路径,所以你只需要使用let htmlData = htmlString.data(using:.utf8)

所以代码:

let rtfPath = Bundle.main.url(forResource: "SampleHTML", withExtension: "rtf") 
let attributedStringWithRtf: NSAttributedString = NSAttributedString(url: rtfPath, options: [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.rtf], documentAttributes: nil)
let htmlString = attributedStringWithRtf.string
let htmlData = htmlString.data(using:.utf8)
let attributedString: NSAttributedString = NSAttributedString(data: htmlData, options: [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil)

注意:我没有故意使用if lettry / catch,因为您已经正确使用它们,我对此更感兴趣在你的问题背后的逻辑以及如何摆脱它。

现在,经过评论讨论后: 您将HTML文本(即带有HTML标记)保存到RTF文件中。 很明显,这太过分了,因为正如你在解决方案中看到的那样,我给你做了两次转换以获得最终NSAttributedString。 所以,我要做的就是使用完全RTF文件,并将RTF标记设置为<p><em><strong>等等,而不是HTML。 使用简单的.txt保存HTML字符串(带有HTML标记)。

例如,我使用 TextEdit.app 保存了一个RTF文件,真正的内容是:

{\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
{\*\expandedcolortbl;;}
\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0

\f0\fs24 \cf0 myText}

我刚写了myText,RTF添加了很多if自己的标签。