1

从文档中,我可以看到输入上下文会将以下方法之一发送到文本视图。

  • insertText:replacementRange:
  • setMarkedText:selectedRange:replacementRange:
  • doCommandBySelector:

在我的测试用例中,当启用输入法时,keyDown可以触发setMarkedText:selectedRange:replacementRange,但是如果我一直删除markedText到最后一个字符,那么输入法将被停用而不会触发上述任何方法。

是否有类似停用的钩子,以便在输入法停用后我可以立即执行某些操作?

4

1 回答 1

0

我从Chromium找到了解决方案。

启用输入法后,用户继续输入或删除,IME 窗口显示在插入符号下方。NSTextInputClient将发送关键事件,输入上下文将调用setMarkText.

问题是,当用户删除最后一个字符时markedText,IME 窗口消失,按键事件被发送并且输入上下文不会调用setMarkText。结果,markedText也不会被清除(如我所料,这应该是一个空字符串)。

Chromium 的解决方案非常简单。只需清除markedText每次时间keyDown,然后setMarkText开始工作。如果markedText为空,表示输入上下文停用输入法并且没有调用setMarkText

好吧,我认为API有点不一致......

于 2020-11-21T11:11:04.097 回答