使用超链接从HTML创建NSAttributedString

6
我将尝试使用NSAttributedString将包含超链接的大型HTML字符串呈现到UITextView中,其中一切都正常工作,除了超链接,它们实际上并没有打开链接。
例如,这是我的HTML字符串的虚拟版本:
let htmlString = "<html><p>If you would like to contact someone, you can email 
them at <a class=rvts10 href=\"mailto:some@one.com\">some@one.com</a></p></html>"

我有一个名为convertHTML()的函数,可以将字符串转换为具有html文档类型选项的NSAttributedString,并将其分配给UITextView的属性文本:

textView.attributedText = htmlString.convertHTML()

TextField是可选的,但不可编辑。页面加载时,您可以看到超链接样式(蓝色文本)和其他内容,但无法点击链接并打开邮件应用程序。

我猜我需要将“mailto:...”更改为iOS将识别的其他内容,但我不知道需要做什么才能使此链接可链接。


这是我的html方法:

func convertHtml() -> 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()
    }
}
2个回答

0

我认为你的convertHTML()方法有错误,请检查一下。

 let htmlString = "<html><p>If you would like to contact someone, you can email them at <a class=rvts10 href=\"mailto:some@one.com\">some@one.com</a></p></html>"

            // you have to convert string to data
            let data = Data(htmlString.utf8)
            // then convert data to NSAttributedString with NSAttributedString.DocumentType.htm
            if let attributedString = try? NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil) {
                self.textView.attributedText = attributedString
            }

我刚刚在下面粘贴了我的convertHTML()方法,我认为这没有问题...可是当我点击链接时,我收到了一个“过滤邮件表格帐户的捆绑标识符:”错误信息。 - user2876886
你是在模拟器上进行测试吗?你的问题是链接不可点击,还是点击时没有任何反应? - Abdelahad Darwish
我正在使用模拟器。事实证明,网页链接可以正常工作,但电子邮件链接不行。所有东西都是可点击的,但实际上电子邮件并没有打开邮件应用程序。然而,网页链接是在默认的网络浏览器中打开的。 - user2876886

-1

我使用这个扩展:

import Foundation

    extension NSAttributedString {

        convenience init(htmlString html: String) throws {
            try self.init(data: Data(html.utf8), options: [
                .documentType: NSAttributedString.DocumentType.html,
                .characterEncoding: String.Encoding.utf8.rawValue
                ], documentAttributes: nil)
        }

    }

在实现之后,你可以像这样使用它:
contentTextField.attributedText = try? NSAttributedString(htmlString: aHTMLString)

2
这与我所拥有的没有任何区别。 - user2876886
是的,扩展是实现这种功能的更好方式,谢谢;-) - Sébastien REMY
4
我的函数位于字符串类的扩展中。你扩展了Attributed字符串类以添加初始化,我扩展了String类以添加一个函数。两者并没有优劣之分,它们提供相同的功能。 - user2876886

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接