NSTextView链接保持"烘焙"即使文本刷新

时间:2017-05-17 18:03:47

标签: swift macos cocoa

似乎在我在 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

更新

  1. 我们的想法是使textview字符串能够容纳文本,链接和文本的混合内容并正确更新。
  2. 需要以编程方式分配文本
  3. 谢谢!

3 个答案:

答案 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)
    }


}