gpt4 book ai didi

html - 如何将 UITextView 的属性文本转换为简单的 HTML 代码? swift

转载 作者:可可西里 更新时间:2023-11-01 00:54:24 29 4
gpt4 key购买 nike

我已经尝试了所有方法...许多文章和 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 标记作为发送到网络服务的结果!

谢谢。

最佳答案

Maddy 的回答确定了您的代码正在解决的狭窄技术问题 String来自 text UITextView的属性(property)而不是完整的 NSAttributedString可从 attributedText 获得属性(property)。该答案解决了您的文本失去粗体样式的问题。如果您按照指示更正代码,将保留粗体样式,但不会以您希望的方式保留。更具体地说,粗体样式将包含在 HTML 文档标题的样式表部分——它不会显示为内联 <b>。标签。

但是,您的问题范围更广。如果可以的话,您的问题的本质是如何使用 HTML 代码进行正确的往返?在不了解您的用例的更多信息的情况下,我不确定我能否完全回答这个问题。对于它们的值(value),我提供以下评论。


显示 HTML

如果您有要显示的 HTML 代码,在 iOS 中执行此操作的最佳方法是使用 WKWebView , 不是 UITextView . StackOverflow 和其他地方有很多 Web View 示例,比如这个 tutorial .

对于您的用例,您需要使用 loadHTMLString(:baseURL:)将 HTML 代码插入到 Web View 中。使用代码中的变量名的一个非常精简的示例,如下所示:

// ... embedded somewhere in a UIViewController
let webView = WKWebView()
self.view = webView
webView.loadHTMLString(htmlTextFromWebService, baseURL: nil)

编辑 HTML

如果您还需要允许用户编辑文本,那么您将面临更大的任务。在这种情况下,我建议探索 GitHub 以获取基于 WKWebView 构建的属性文本编辑器的示例。 , 比如 RichEditorView .


向您的网络服务发送 HTML 代码

您的示例使用了 NSAttributedString方法 data(from:documentAttributes:)创建属性字符串的 HTML 代码表示。该方法创建一个完整格式的 HTML 文档,带有完整的标题,并在标题中使用样式表来提供样式。

您声明网络服务无法处理此文本。我怀疑您的 Web 服务仅采用没有标题、样式表等的原始 HTML 代码。如果是这样,data(from:documentAttributes:)方法不适用于此目的。

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

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

关于html - 如何将 UITextView 的属性文本转换为简单的 HTML 代码? swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53285287/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com