似乎在我在 self.textView.isAutomaticDataDetectionEnabled = true
self.textView.isAutomaticLinkDetectionEnabled = true
self.textView.string = "http://www.google.com"
self.textView.checkTextInDocument(nil) // required to get the link working
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
// This will appear as link to google (NOT GOOD)
self.textView.string = "This is a test."
self.textView.checkTextInDocument(nil) // This doesn't help
}
文本中更改文本字符串后,新文本仍然是超链接并指向上一个文本。
这里是代码位:
base URL
为了让事情变得更轻松,我已经建立了一个GitHub项目,这样你就可以轻松地见证这个奇迹:https://github.com/switchawk/NSTextViewLinks
更新
谢谢!
答案 0 :(得分:1)
这似乎按预期工作:
textView.textStorage!.setAttributedString(NSAttributedString(string: ...))
textView.checkTextInDocument(nil)
答案 1 :(得分:0)
不确定这是否会有所帮助,但在iOS上我遇到了同样的问题,它在设置新字符串后有助于关闭和打开数据检测器。
所以我假设在MacOS上:
self.textView.string = "This is a test."
self.textView.isAutomaticDataDetectionEnabled = false
self.textView.isAutomaticDataDetectionEnabled = true
答案 2 :(得分:0)
真正的问题是你如何设定textView.string
?您可以通过以下方式之一获得所需的结果。
override func viewDidAppear() {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.textView.string = "This is a test!"
if (self.textView.string?.hasPrefix("http:"))! {
self.textView.checkTextInDocument(nil)
} else {
self.textView.isAutomaticDataDetectionEnabled = false
self.textView.isAutomaticLinkDetectionEnabled = false
self.textView.checkTextInDocument(nil)
let currentText = self.textView.string
self.textView.string = ""
self.textView.string = currentText
}
}
}
即使您只是运行此代码。您删除所有文本并在框中键入不可链接的文本,它不会显示为链接。
override func viewDidLoad() {
super.viewDidLoad()
self.textView.isAutomaticDataDetectionEnabled = true
self.textView.isAutomaticLinkDetectionEnabled = true
self.textView.string = "http://www.google.com"
self.textView.checkTextInDocument(nil)
print(self.textView.string!)
}
如果您运行此代码,则会获得与删除所有文本相同的效果。
override func viewDidLoad() {
super.viewDidLoad()
self.textView.isAutomaticDataDetectionEnabled = true
self.textView.isAutomaticLinkDetectionEnabled = true
self.textView.string = "http://www.google.com"
self.textView.checkTextInDocument(nil)
print(self.textView.string!)
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.textView.string = ""
self.textView.string = "This is a test!"
}
}
更新:
根据您的评论和答案,工作代码将如下所示。
override func viewDidLoad() {
super.viewDidLoad()
self.textView.isAutomaticDataDetectionEnabled = true
self.textView.isAutomaticLinkDetectionEnabled = true
self.textView.string = "http://www.google.com"
self.textView.checkTextInDocument(nil)
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.textView.textStorage!.setAttributedString(NSAttributedString(string: "This is a test! http://www.espn.com"))
self.textView.checkTextInDocument(nil)
}
}