我的 UIAlertController 可以正常显示所有 HTML 格式,但链接不可单击。这里的帖子假设我们知道链接在哪里,但短信来自 API,因此我无法控制特定的字符串。我希望有一个通用属性可以分配给 UIAlertController,以便链接变得可点击。谢谢
let htmlText = "Some text from API with random links here and there"
let alertController = UIAlertController(title: "Details", message:"", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
let attributedText = htmlText.html2AttributedString
alertController.setValue(attributedText, forKey: "attributedTitle")
这里是字符串扩展html2AttributedString,但是这个扩展正在工作,所以不需要检查这部分:
extension String {
var html2AttributedString: NSAttributedString? {
do {
return try NSAttributedString(data: Data(utf8),
options: [.documentType: NSAttributedString.DocumentType.html,
.characterEncoding: String.Encoding.utf8.rawValue],
documentAttributes: nil)
} catch {
print("error: ", error)
return nil
}
}
}
最佳答案
以标准方式这是不可能的,因为您无权访问 UIAlertController
内部的 UILabel
在普通的 UILabel
中,您可以在 UILabel
上添加点击手势并处理该手势。
所以这里你需要一个自定义的UIAlertController
但我建议您从 html 文本中导出链接并将其显示为操作按钮,如下所示:
var links : [String:NSURL] = [:]
let range = NSMakeRange(0, attributedText.length)
attributedText.enumerateAttribute(.link, in: range, options: .longestEffectiveRangeNotRequired) {attribute, range, pointer in
let text = attributedText.attributedSubstring(from: range).string
if let url = attribute as? NSURL {
links[text] = url
}
}
links.forEach { (linkText, url) in
alertController.addAction(UIAlertAction(title: linkText, style: .default, handler: {_ in
UIApplication.shared.openURL(url as URL)
}))
}
关于swift - 如何使用 HTML 链接使 UIAlertController 文本消息上的链接可点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48857304/