目标是在用户输入UITextView
时实时将URL变成蓝色,类似于Twitter在编写推文时的工作方式。
以下代码显示了一个选项:使用NSDataDetector
检测textViewDidChange(textView:)
内部的链接。这样,您就可以检测到有人在添加/删除字符以形成/断开URL字符串时的情况,并且还可以在有人粘贴文本块时进行处理。但是,由于您要检查每个键入的字母的全文,因此性能令人恐惧。
textView:shouldChangeTextInRange:replacementText:
内部的检测似乎很有希望,因为您仅在检查替换文本。但是,这似乎有点骇人听闻,因为该功能的目的似乎是授予/拒绝编辑文本的权限,而不是修改任何内容。
理想情况下,会有一种更合适的功能来修改替换文本,但似乎没有。
在UITextView中实时为URL着色的最佳方法是什么?
// Exit if no attributed text
guard let attributedText = textView.attributedText else {
return
}
// Get mutuable attributed text
let mutableAttributedText = NSMutableAttributedString(attributedString: attributedText)
// Detect and linkify URLs in text
do {
// Set detector
let types: NSTextCheckingResult.CheckingType = [.link]
let detector = try NSDataDetector(types: types.rawValue)
let detectorRange = NSMakeRange(0, textView.text.count)
// Iterate over matches
detector.enumerateMatches(in: textView.text, options: [], range: detectorRange) { result, _, _ in
// Found detector result?
if let result = result {
// Linkify text if it contains URL
if result.resultType == .link {
// Set link attributes
let urlString = mutableAttributedText.attributedSubstring(from: result.range)
let linkAttributes: [NSAttributedString.Key: Any] = [
.foregroundColor: curLinkColor,
NSAttributedString.Key.link: urlString
]
// Update <mutableAttributedText>
mutableAttributedText.addAttributes(linkAttributes, range: result.range)
// Print status
print("Converted link: \(urlString). Detector result: \(result).")
}
}
}
} catch {
printError("Error detecting types in text view: \(error).")
}