如何在Swift中从UITextView获取链接范围

如何在Swift中从UITextView获取链接范围,uitextview,nsattributedstring,ios14,xcode12,Uitextview,Nsattributedstring,Ios14,Xcode12,我有一个聊天应用程序,带有UITextView,带有动态文本(来自服务器或由用户键入)。我需要检测所有类型的链接,UITextView在检测电话号码、地址、超链接和日历事件方面做得非常好。如果UITextView在样式方面存在不足,则存在多个问题: 地址链接不使用tintColor或linktexttributes属性中的颜色,也不使用appearance()代理 默认情况下,所有链接都带有下划线 有些链接的颜色是正确的,但我看不出为什么省略某些链接的模式(看起来可能与单词wrap有关) 设置自

我有一个聊天应用程序,带有
UITextView
,带有动态文本(来自服务器或由用户键入)。我需要检测所有类型的链接,
UITextView
在检测电话号码、地址、超链接和日历事件方面做得非常好。如果
UITextView
在样式方面存在不足,则存在多个问题:

  • 地址链接不使用
    tintColor
    linktexttributes
    属性中的颜色,也不使用
    appearance()
    代理
  • 默认情况下,所有链接都带有下划线
  • 有些链接的颜色是正确的,但我看不出为什么省略某些链接的模式(看起来可能与单词wrap有关)
  • 设置自定义
    underlineStyle
    属性时,文本将消失
  • 因此,我认为最好的做法是仍然使用
    UITextView
    来检测链接,但随后创建我自己的属性字符串,并按照我想要的方式设置所有内容的样式。为此,我需要链接的范围,但我找不到获得它们的方法

    我试过这个:

    open func enumerateAttributes(in enumerationRange: NSRange, options opts: NSAttributedString.EnumerationOptions = [], using block: ([NSAttributedString.Key : Any], NSRange, UnsafeMutablePointer<ObjCBool>) -> Void)
    
    打开func enumerateAttributes(在enumerationRange:NSRange中,选项选项选项:NSAttributedString.EnumerationOptions=[],使用块:([NSAttributedString.Key:Any]、NSRange、UnassemutablePointer)->Void)
    

    但是,如果我查找它们,就不会有任何
    .link
    元素,也不会有任何下划线属性。所以问题是,有没有办法从
    UITextView
    获取链接范围?或者也许有一种方法可以可靠地设置我丢失的链接的样式?

    要检测电话号码、地址等,实际上您正在使用

    这就是您在InterfaceBuilder中实际设置的内容:

    然后:


    电话号码、地址等,通过数据检测器机制进行检测。我想您可以使用
    match.range
    then;)@Larme真棒,这会让我忘记UITextView,自己设计一切。如果你写在回答中,我会接受。我们需要日历或提醒应用程序的授权吗?如果iOS在点击检测到的链接时显示动作控制器?这是默认行为。我没有使用任何API来创建事件或提醒。
    let types: NSTextCheckingResult.CheckingType = [.address, .link, .phoneNumber, .date]
    let detector = try? NSDataDetector(types: types.rawValue)
    let matches = detector.matches(in: text, options: [], range: NSRange(location: 0, length: text.utf16.count))
    matches.forEach {
        guard let range = Range($0.range, in: text) else { return }
        let sub = String(text[range])
        print(sub)
    }