NSTextView 自动拼写检查无法正常工作

NSTextView auto spell checking not working properly

我有一个继承自 NSTextView 的 class,它在初始化时使用 setContinuousSpellCheckingEnabled(true) 设置自动拼写检查,并在聚焦时将自己设置为第一响应者。根据到目前为止我在 SO 上看到的所有问题和答案,这似乎足以确保拼写检查器正常工作。

但是当我在视图中输入乱码时,它不会在任何拼写错误的单词下划线,除非输入的单词相对较快。也就是说,当我在大约半秒内键入 "asdf" 并在其后加上 space 时,拼写检查器会正确地在其下划线。但是如果我输入 "asdf" 慢一点,或者即使我快速输入 "asdf" 但在添加 space 之前稍等片刻,单词上也不会显示下划线。

这会导致多次输入同一个词的拼写评估可能会出现冲突,如下所示。

在测试期间甚至有一次我看到红色下划线出现一瞬间,然后立即从我输入的拼写错误的单词中消失。

还值得注意的是,如果焦点离开并重新进入文本视图,在焦点后约 1 秒后,所有波浪形下划线都会出现在所有拼写错误单词下方的正确位置。但是,继续键入其他文本仍然会引发我上面提到的问题。

这意味着拼写错误的单词不会加下划线,除非

  1. 它们的输入速度不合理

  2. 它们是在聚焦视图之前输入到文本视图中的

正如我之前所说,我已经查看了所有相关的 SO 线程,并且我还广泛地研究了对 makeFirstResponder()setContinuousSpellCheckingEnabled() 的调用,并且我已经大约 运行 出主意。

快速更新,自上周以来我尝试了更多的东西,其中之一显示出希望。使用 TextView 函数 setSpellingState,我能够以编程方式强制红色波浪下划线出现在我喜欢的 TextView 中的任何位置。虽然这看起来很有希望,但使用此函数反而发现了另一个错误行为:当我调用此函数并在视图中的某处出现红色波浪线时,波浪线只会短暂出现。波浪形的红色下划线出现,经过与我在 "asdf" 错误中看到的大致相同的延迟后,波浪线消失了。这让我认为问题可能是由覆盖某些 Cocoa API.

的 C# 代码引起的

这是 OSX 问题吗?为什么像我键入的速度这样随意决定拼写检查器是否会正确地在单词下划线的决定因素?

P.S。该代码的语法不同于 Objective-C 语法,因为我使用的是 MCocoa,它是机器为 Cocoa API 生成包装器的工具。我目前用来引用 NSTextView 的 C# 代码是从 MacOSX 10.5 SDK

生成的

当使用 setSpellingState 时,由于 setSpellingState 和自动拼写检查器之间的竞争条件,波浪线有时会出现并立即消失。似乎如果他们都试图同时突出显示一个词,他们就会相互抵消。由于自动拼写检查器的行为首先导致了整个问题,我只是将 setContinuousSpellCheckingEnabled(true) 替换为 setContinuousSpellCheckingEnabled(false),以防止自动拼写检查器干扰我自己的实现。现在,无论我如何键入单词,红色波浪形下划线都可以正确显示!当然只要拼错了:)

对于 NSTextView 的自动拼写检查器有问题的任何人,我可以使用 setContinuousSpellCheckingEnabled(false) 简单地禁用自动拼写检查器,并使用 NSSpellChecker.shared() 入侵我自己的自动拼写检查器来检查拼写错误单词,setSpellingState 强制在 NSSpellChecker 发现的拼写错误的单词下方绘制红色波浪拼写指示器。所有这些都是在 textViewDidChangeSelection 的实现中完成的,因此每次通过键入、将光标从不完整的单词移动或粘贴文本来更改选择时都可以检查单词。