我正在构建自定义键盘库,并希望为其添加自动完成功能。为此,我需要检测用户输入的时间。
UIInputViewController
提供了两个用于检测文本更改的功能:textWillChange
和textDidChange
。但是,当用户类型和文本发送到代理时,不会调用它们。
我正在使用Xcode 10.2.1,可以在模拟器和真实设备上重现此代码。我可以在自定义键盘库项目和全新的测试项目中重新创建它。
问题是这样的:当您使用textWillChange
将文本发送到文本文档代理时,不会调用textDidChange
和textDocumentProxy.insertText("something")
。但是,如果更改光标位置,则将正确调用这些函数。
我尝试启动一个计划的计时器,该计时器每秒触发一次,以检查文本文档代理,但是即使我在计时器刻度之间插入文本,其信息也不会改变。
但是,由于更改光标位置会导致调用这些函数,并且还会更新文档代理信息,因此我尝试在预定的计时器刻度中执行以下操作:
textDocumentProxy.adjustTextPosition(byCharacterOffset: 1)
textDocumentProxy.adjustTextPosition(byCharacterOffset: -1)
但这没有用,因为代理必须应用更改。但是,如果我切换值并调整位置1,-1、1等,则会正确调用函数并更新代理信息。
但是,这不是解决此问题的可接受方法。即使用户空闲,它也可以使自定义键盘不断更新。同样,调整文本位置最终将导致用户键入的文本以错误的位置结尾。
有没有人遇到这个问题并设法解决了这个问题而没有添加计时器?