我有一个继承自NSTextView的类,在初始化时,它使用setContinuousSpellCheckingEnabled(true)
设置自动拼写检查,并在聚焦时将自己设置为第一个响应者。根据我迄今为止在SO上看到的所有问题和答案,这似乎足以确保拼写检查工作正常。
但是当我在视图中输入乱码时,它不会突出显示任何拼写错误的单词,除非这个单词的输入速度相对较快。也就是说,当我输入" asdf"在大约半秒钟之后有一个空格,拼写检查器正确地强调它。但是如果我输入" asdf"任何慢,或者即使我快速键入" asdf"但是在添加空格之前等待一秒钟,单词上不会显示下划线。
这导致可能多次输入相同的单词,并且拼写评估相互矛盾,如下所示。
在测试期间甚至有一次我看到红色下划线出现瞬间,然后立即从我输入的拼写错误的单词中消失。
另外值得注意的是,如果焦点离开并重新进入文本视图,在焦点约1秒后,所有拼写下划线都出现在所有拼写错误的单词下的正确位置。然而,继续输入其他文本仍然会引起我上面提到的问题。
这意味着除非
,否则拼写错误的单词不会加下划线他们的输入速度不合理
在聚焦视图
正如我之前所说的那样,我已经查看了所有相关的SO主题,并且我也广泛地调用了makeFirstResponder()
和setContinuousSpellCheckingEnabled()
,并且我刚刚用完了想法。
快速更新,自上周以来,我已经尝试了一些其他的东西,其中一个显示出了希望。使用TextView函数setSpellingState
,我能够以编程方式强制使用红色波浪线下划线出现在TextView中的任何位置。虽然这似乎很有希望,但是使用这个函数反而发现了另一个错误的行为:当我调用这个函数并在视图中的某处出现一个红色波浪形时,波浪线只会短暂出现。出现了波浪形的红色下划线,并且在我看到" asdf"之后的延迟大致相同。 bug,波浪线消失了。这让我认为问题可能是由于C#代码覆盖了一些Cocoa API。
这是OSX问题吗?为什么某些东西像我输入拼写检查器是否会正确地强调一个单词的决定因素的速度一样随意?
P.S。代码的语法与Objective-C语法不同,因为我使用的是MCocoa,它是一个机器生成的Cocoa API包装器。我目前用于引用NSTextView的C#代码是从MacOSX 10.5 SDK生成的
答案 0 :(得分:1)
使用setSpellingState
时,由于setSpellingState
和自动拼写检查器之间的竞争条件,有时会出现波浪线并立即消失。似乎他们两个都试图同时突出一个词,他们会互相取消。由于自动拼写检查程序的行为是导致整个问题的原因,我只是将setContinuousSpellCheckingEnabled(true)
替换为setContinuousSpellCheckingEnabled(false)
,从而阻止自动拼写检查程序干扰我自己的实现。现在红色的波浪线下划线正确显示,无论我怎么输入这个词!只要它当然拼写错误:)
对于任何遇到NSTextView自动拼写检查程序问题的人,我只能使用setContinuousSpellCheckingEnabled(false)
禁用自动拼写检查程序,并使用NSSpellChecker.shared()
攻击我自己的自动拼写检查程序以检查拼写错误的单词,并setSpellingState
在NSSpellChecker
创建的拼写错误的单词下强制绘制红色波浪形拼写指示符。所有这些都是在textViewDidChangeSelection
的实现中完成的,因此每次更改选择时都可以通过键入,从不完整的单词移动光标或粘贴文本来检查单词。