【问题标题】:NSTextView auto spell checking not working properlyNSTextView 自动拼写检查无法正常工作
【发布时间】:2016-11-09 20:26:44
【问题描述】:

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

但是当我在视图中输入 gibberish 时,它不会在任何拼写错误的单词下划线,除非该单词的输入速度相对较快。也就是说,当我在大约半秒内键入带有空格的“asdf”时,拼写检查器会正确地加下划线。但是,如果我输入“asdf”的速度慢一些,或者即使我快速输入“asdf”但在添加空格之前等待一秒钟,单词上将不会显示下划线。

这会导致多次键入相同单词时出现拼写评估冲突的可能性,如下所示。

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

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

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

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

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

正如我之前所说,我已经查看了所有相关的 SO 线程,并且我还广泛使用了对 makeFirstResponder()setContinuousSpellCheckingEnabled() 的调用,但我几乎没有想法了。

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

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

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

【问题讨论】:

    标签: c# macos cocoa spell-checking nstextview


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      相关资源
      最近更新 更多