如何在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()
代理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)
}