HTML UITextView 中的格式

HTML Format in UITextView

我对 iOS 开发还很陌生,现在正在开发一个接收某种 JSON 数据的应用程序。但是一些后端专家认为,如果他们直接从 Word 中复制信息并将其粘贴到信息系统中,对用户来说会更好。所以我坐在这里,试图在 UITableView 中创建一个可点击的 Link。

我从 Web 解析数据并得到一个具有以下格式的字符串:

F&uuml;r mehr Informationen klicken sie <a href="http://www.samplelink.com/subpage.php?id=8">here</a>.

我已经尝试过 UILabel,但经过一些研究后,我现在使用经常推荐的 UITextView。在属性检查器中,我将其设置为属性文本并启用 Link 检测。现在文本显示为红色并且可以点击。

我现在的问题是,HTML 标签和正确的(德语)字符集仍然丢失,我不知道如何以正确的方式显示它。

显示的字符串是这样解析的:

    func showHTMLString(unformattedString: String) -> NSAttributedString{
    var attrStr = NSAttributedString(
        data: tmpString.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!,
        options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil,
        error: nil)
    return attrStr!
}

如果我用 attrStr?.string 填充 Textview,格式会以正确的方式显示,但 link 也会消失。

关于如何以正确的方式格式化显示的字符串有什么建议吗?

提前致谢 AR4G4

创建属性字符串后,您可以将 UITextViewattributedText 属性 设置为 NSAttributedString 本身,而不是 string 属性 该属性字符串。

我建议在 UIWebView 中显示 HTML。它比使用 UITextView 更健壮。有关详细信息,请参阅 Display html text in uitextview

检查 IB 中 UITextView 的属性。为了使链接有效,您必须选中 Selectable

问题是您必须将字符编码选项从 NSUnicodeStringEncoding 更改为 NSUTF8StringEncoding 才能以正确的方式加载您的 html。我认为你应该创建一个字符串扩展只读计算 属性 来将你的 html 代码转换为属性字符串:

Xcode 8.3.1 • Swift 3.1

extension Data {
    var attributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options:[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            print(error)
        }
        return nil
    }
}
extension String {
    var data: Data {
        return Data(utf8)
    }
}

let htmlStringCode = "F&uuml;r mehr Informationen klicken sie <a href=\"http://www.samplelink.com/subpage.php?id=8\">here</a>"

htmlStringCode.data.attributedString?.string ?? ""  // "Für mehr Informationen klicken sie here"

你的情况

yourTextView.attributedText = htmlStringCode.data.attributedString

您的版本非常接近开始。正如 Leonardo Savio Dabus 所说,您可能应该尝试 NSUTF*StringEncoding。以下为我生成了您的预期输出。正如他所说,如果您经常这样做,您可能想将它添加到字符串的扩展名中。

    let theString = "F&uuml;r mehr Informationen klicken sie <a href=\"http://www.samplelink.com/subpage.php?id=8\">here</a>."
    let theAttributedString = NSAttributedString(data: str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!,
                                                 options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil, error: nil)
    theTextView.attributedText = atString

我以前的另一种方法:

var someHtmlString = "F&uuml;r mehr Informationen klicken sie <a href=\"http://www.samplelink.com/subpage.php?id=8\">here</a>."
let regex = try! NSRegularExpression(pattern: "<.*?>", options: [.CaseInsensitive])
let range = NSRange(location: 0, length: someHtmlString.characters.count)
let htmlLessString: String = regex.stringByReplacingMatchesInString(someHtmlString, options: NSMatchingOptions(), range:range, withTemplate: "")

最终结果 -> htmlLessString 是

"F&uuml;r mehr Informationen klicken sie here."

我有一个带有 UITextView 的应用程序,我希望能够从浏览器粘贴 html 格式的文本,然后将其作为字符串(包含 html 格式)保存到数据库,然后另一次从数据库中检索它并以与第一次从网站复制时相同的格式显示它。 我通过这两个扩展来管理这个:

extension String
{
    func getAttributedStringFromHTMLString() -> NSAttributedString
    {
        do {
            let attributedString = try NSAttributedString(data: self.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!, options: [NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType], documentAttributes: nil)
            return attributedString
        } catch {
            print(error)
            return NSAttributedString()
        }
    }
}

extension NSAttributedString
{
    func getHTMLString() -> String
    {
        var htmlText = "";
        let documentAttributes = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
        do {
            let htmlData = try self.dataFromRange(NSMakeRange(0, self.length), documentAttributes:documentAttributes)
            if let htmlString = String(data:htmlData, encoding:NSUTF8StringEncoding) {
                htmlText = htmlString
            }
            return htmlText
        }
        catch {
            print("error creating HTML from Attributed String")
            return ""
        }
    }
}

我使用代码 Swift 4:

var descriptionStr : String = String() //Dynamic text

let regex = try! NSRegularExpression(pattern: "<.*?>", options: [.caseInsensitive])
        let range = NSRange(location: 0, length: descriptionStr.count)
        let htmlLessString: String = regex.stringByReplacingMatches(in: descriptionStr, options: NSRegularExpression.MatchingOptions(), range:range, withTemplate: "")
        textViewRef.text = htmlLessString