如何查看NSTextInputClient中输入法的状态?
How to check the status of input method in NSTextInputClient?
From the docs,我可以看到输入上下文会向文本视图发送以下方法之一。
insertText:replacementRange:
setMarkedText:selectedRange:replacementRange:
doCommandBySelector:
在我的测试用例中,当启用输入法时,keyDown
可以触发setMarkedText:selectedRange:replacementRange
,但是如果我一直删除markedText
直到最后一个字符,那么输入法将被停用不触发上述任何方法。
是否有类似停用挂钩的东西,以便我可以在停用输入法后立即执行某些操作?
我从 Chromium 中找到了解决方案。
启用输入法后,用户不断键入或删除,插入符下方显示 IME window。 NSTextInputClient
将发送按键事件,输入上下文将调用 setMarkText
.
问题是,当用户删除 markedText
的最后一个字符时,IME window 消失,键事件被发送并且输入上下文 不会调用 setMarkText
。结果,markedText
也不会被清除(如我所料,它应该是一个空字符串)。
Chromium 的解决方案非常直接。只需在每次 keyDown
时清除 markedText
,让 setMarkText
完成工作。如果 markedText
为空,表示输入上下文已停用输入法且未调用 setMarkText
.
嗯,我认为 API 有点不一致...
From the docs,我可以看到输入上下文会向文本视图发送以下方法之一。
insertText:replacementRange:
setMarkedText:selectedRange:replacementRange:
doCommandBySelector:
在我的测试用例中,当启用输入法时,keyDown
可以触发setMarkedText:selectedRange:replacementRange
,但是如果我一直删除markedText
直到最后一个字符,那么输入法将被停用不触发上述任何方法。
是否有类似停用挂钩的东西,以便我可以在停用输入法后立即执行某些操作?
我从 Chromium 中找到了解决方案。
启用输入法后,用户不断键入或删除,插入符下方显示 IME window。 NSTextInputClient
将发送按键事件,输入上下文将调用 setMarkText
.
问题是,当用户删除 markedText
的最后一个字符时,IME window 消失,键事件被发送并且输入上下文 不会调用 setMarkText
。结果,markedText
也不会被清除(如我所料,它应该是一个空字符串)。
Chromium 的解决方案非常直接。只需在每次 keyDown
时清除 markedText
,让 setMarkText
完成工作。如果 markedText
为空,表示输入上下文已停用输入法且未调用 setMarkText
.
嗯,我认为 API 有点不一致...