迅捷:转换为NSAttributed字符串的HTML数据无法使链接在标签中可点击

时间:2019-04-24 08:59:29

标签: html ios swift nsattributedstring

我有一个HTML格式的文本。我正在使用NSAttributed字符串的属性来解析它。它可以很好地解析文本并显示在标签上。但是,锚标记的解析不会使链接可单击。这是我用于解析的以下代码。

extension String {
var htmlToAttributedString: NSAttributedString? {
    guard let data = data(using: .utf8) else { return NSAttributedString() }
    do {
        return try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding:String.Encoding.utf8.rawValue], documentAttributes: nil)
    } catch {
        return NSAttributedString()
    }
}
var htmlToString: String {
    return htmlToAttributedString?.string ?? ""
}

当我运行应用程序并将其值赋予标签时:

text = "<p>This is <a href=\"http://www.google.com\">Google Home</a></p>"
simpleTextLabel.attributedText = text.htmlToAttributedString

iOS App上的输出如下所示,但是单击时没有任何反应:

这是Google Home

如何在野生动物园中打开它?

1 个答案:

答案 0 :(得分:1)

从您的行:

simpleTextLabel.attributedText = text.htmlToAttributedString

我们可以假设simpleTextLabelUILabel

UILabel开始,它是不可交互的基本行为。您可以在其上添加轻击手势,但会将其转换为UIButton

有一些技巧可以使UILabel成为可能,找到确切的位置,检查是否有链接等。 寻找“ UILabel Clickable”:Create tap-able "links" in the NSAttributedString of a UILabel?等。甚至还有一些第三方库。

(以我的拙见)将其视为“黑客”。

WWDC 2008 Session: TextKit Best Practices很不错。在2:34,它说明了如果您需要与显示的文本进行交互,则首选UITextView胜过UILabel

有一个UITextViewDelegate方法正用于此:textView(_:shouldInteractWith:in:interaction:)

请注意,UITextViewUILabel的呈现方式略有不同。如果叠加它们,它们将没有相同的“起点”,布局会有所不同。但是,只需稍作更改,它就可以相同(例如:How can I make a UITextView layout text the same as a UILabel?)。

还要注意,根据对UITextViewUILabel视觉呈现的细微修改,用户不会注意到差异(事实上,重要的是,除了使用本机方法UITextView / UITextViewDelegate使其易于随后被其他开发人员理解,或者在几个月内(如果您需要进行一些小的修改)。