swift - 如何使用 HTML 链接使 UIAlertController 文本消息上的链接可点击

标签 swift nsattributedstring uialertcontroller

我的 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/

相关文章:

ios - 带有迦太基的 sqlite.swift

ios - 如何使用正确的自动换行跨等边界 View 拆分 NSAttributedString

android - 使用 iOS 键盘输入时表情符号不显示在 NSAttributedString 中,在 Android 上输入时显示

ios - 在 UIAlertController 之后重新加载 View

ios - 如何在推送 View Controller SWIFT 之前预加载所有 tableView 单元

ios - 具有模拟器支持的 Core Image 着色器语言转换为 Metal

iOS/Swift - UITableView reloadData 未被调用

ios - 警告 - 尝试在 Swift 中显示 UIAlertController null

ios - 如何仅从共享扩展启动应用程序而无需在 Swift 中弹出弹出窗口?

ios - 如何使用 MonoTouch 有效地呈现伪 HTML?