我已经尝试了一切...许多文章和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服务!
谢谢。
答案 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代码,那么在iOS中,最好的方法是使用NSAttributedString
,而不是attributedText
。在StackOverflow和其他地方有很多Web视图示例,例如tutorial。
在您的用例中,您需要使用<b>
将HTML代码插入Web视图。一个非常简单的示例,使用代码中的变量名,如下所示:
WKWebView
如果您还需要允许用户编辑文本,那么您前面有一个更大的任务。在这种情况下,我建议在GitHub上浏览以UITextView
为基础的属性文本编辑器的示例,例如RichEditorView。
您的示例使用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解析器。看来您可能正在使用非常简单的文本和样式。如果是这样,则此类解析器的实现应该很简单。如果您需要此类解析器的示例,请发表评论,我将提供一些示例代码。