如何将UITextView的属性文本转换为简单的HTML代码?迅速

时间:2018-11-13 16:22:20

标签: html swift tags

我已经尝试了一切...许多文章和stackoverflow帖子,但我似乎无法正确解决。场景:我从Web服务获取html代码,非常简单的示例是:

"<b>TEST</b>"

我将此字符串转换为attributedString,如下所示:

extension String {

var htmlToAttributedString: NSAttributedString? {
    guard let data = data(using: .utf8) else { return NSAttributedString() }
    do {
        return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
    } catch {
        return NSAttributedString()
    }
  }
}

然后我将其显示如下:

self.textView.attributedText = htmlTextFromWebService.htmlToAttributedString

完美,我的UITextView以粗体显示“ TEST”。

现在是问题所在:我正在尝试将其发回,但黑体字消失了。 这是我的操作方式:

let attrString = NSAttributedString(string: self.textView.text)
var resultHtmlText = ""

 do {
        let r = NSRange(location: 0, length: attrString.length)
        let att = [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType]

        let data = try attrString.data(from: r, documentAttributes: att)

        if let h = String(data: data, encoding: .utf8) {

            resultHtmlText = h
        }
    } catch {
        print("FAILED TO CONVERT TO HTML")
    }

resultHtmlText现在为:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
<meta name="Generator" content="Cocoa HTML Writer">
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px}
span.s1 {font-family: 'Helvetica'; font-weight: normal; font-style: normal; font-size: 12.00pt}
</style>
</head>
<body>
<p class="p1"><span class="s1">TEST</span></p>
</body>
</html>

但是Web服务无法读取此内容,此外,粗体标记已消失! 所以最终,我如何才能得到resultHtmlText是这样的:

"<b>TEST</b>"

我只希望将简单的html标签作为结果发送到Web服务!

谢谢。

2 个答案:

答案 0 :(得分:1)

更改

let attrString = NSAttributedString(string: self.textView.text)

收件人

let attrString = self.textView.attributedText

这将返回属性,但仍将提供完整的HTML结果。

答案 1 :(得分:1)

Maddy的答案指出了一个狭窄的技术问题,即您的代码是从String的{​​{1}}属性中提取普通text,而不是从{{ 1}}属性。该答案解决了文本丢失粗体样式的问题。如果您按照指示更正代码,则将保留粗体样式,但不会保留您想要的方式。更具体地说,粗体样式将包含在HTML文档标题的样式表部分中-不会显示为嵌入式UITextView标记。

但是,您的问题更广泛。如果可以的话,您的问题的重点在于如何与HTML代码进行正确的往返?在不了解您的用例的情况下,我不确定是否可以完全回答该问题。对于它们的价值,我提供以下评论。


显示HTML

如果要显示HTML代码,那么在iOS中,最好的方法是使用NSAttributedString,而不是attributedText。在StackOverflow和其他地方有很多Web视图示例,例如tutorial

在您的用例中,您需要使用<b>将HTML代码插入Web视图。一个非常简单的示例,使用代码中的变量名,如下所示:

WKWebView

编辑HTML

如果您还需要允许用户编辑文本,那么您前面有一个更大的任务。在这种情况下,我建议在GitHub上浏览以UITextView为基础的属性文本编辑器的示例,例如RichEditorView


将HTML代码发送到您的Web服务

您的示例使用loadHTMLString(:baseURL:)方法// ... embedded somewhere in a UIViewController let webView = WKWebView() self.view = webView webView.loadHTMLString(htmlTextFromWebService, baseURL: nil) 创建属性字符串的HTML代码表示。该方法将创建具有完整标题的格式完整的HTML文档,并在标题中使用样式表来提供样式。

您声明Web服务无法处理此文本。我怀疑您的Web服务仅采用原始HTML代码而没有标题,样式表等。如果是这样,WKWebView方法将无法实现此目的。

一种解决方案是通过始终通过NSAttributedString使用原始HTML代码来避免往返转换问题。见上文。

另一个解决方案是编写自己的简单NSAttributedString-to-HTML解析器。看来您可能正在使用非常简单的文本和样式。如果是这样,则此类解析器的实现应该很简单。如果您需要此类解析器的示例,请发表评论,我将提供一些示例代码。