如何从 iOS 键盘扩展中检测到通过在 iMessage 中点击“发送”等操作清除了文本字段?

Posted

技术标签:

【中文标题】如何从 iOS 键盘扩展中检测到通过在 iMessage 中点击“发送”等操作清除了文本字段?【英文标题】:How to detect from iOS keyboard extension that a textfield is cleared via actions like hitting "Send" in iMessage? 【发布时间】:2015-07-17 20:03:53 【问题描述】:

在我的 ios 键盘应用程序中,我目前有一个文本建议栏,很像默认的 iOS 8 键盘的建议栏。每当用户执行清除文本字段的操作时(例如,当有人在 iMessage 或 Whatsapp 上点击“Send”时),我想清除建议栏上的所有文本。

由于点击“发送”不是击键,我想知道是否有办法在清除文本字段时从键盘检测。

我已经尝试检测空文本"" 或新行"\n",但到目前为止这还没有奏效。

编辑:我知道这可以通过第 3 方 iOS 键盘实现,如这里所示(来自 Themeboard)

点击发送之前,请注意建议栏中的文字。

点击“发送”后立即。建议栏已清除。

【问题讨论】:

我不是键盘扩展方面的专家,但是有什么方法可以检测到 textField 的变化吗?然后你可以清除文本长度是否为零。 @SFF 这是一个非常好的建议。我尝试检测self.textDocumentProxy.documentContextBeforeInput(它检测文本字段上的内容),但不幸的是我似乎可以找到导致documentContextBeforeInput被擦除的操作(即,当发送被击中时),所以我可以插入适当的方法跟随这个。 好吧,这是一个可怕的想法,但你可以设置 NSTimer,它每 0.1 秒调用一次documentContextBeforeInput。当然它会像疯了一样使用 CPU,但至少有办法。 @SFF 没错,感谢您的后续建议。但是,鉴于分配给扩展的内存上限比常规应用程序低得多,这会使键盘更容易崩溃,这不是很好:/ 所以现在当你点击“发送”时,你输入的信息被清除了,但建议栏中的文字仍然显示,对吧? 【参考方案1】:

当在消息中按下发送按钮时,textDidChange: 回调将在您的 UIInputViewController 子类上调用。此时,UIInputViewController 子类的textDocumentProxy 属性的documentContextAfterInputdocumentContextBeforeInput 属性都将为nil 或空字符串。虽然您知道为什么文本字段被清除,但对于大多数发生这种情况的情况,您可能可以推断出您应该清除当前的下一个单词预测。

- (void)textDidChange:(id<UITextInput>)textInput

    if ((!self.textDocumentProxy.documentContextBeforeInput && !self.textDocumentProxy.documentContextAfterInput) || ([self.textDocumentProxy.documentContextBeforeInput isEqualToString:@""] && [self.textDocumentProxy.documentContextAfterInput isEqualToString:@""]))
        //Implement code to clear the banner
        [self.keyboard.lblBanner setText: @""];
    

【讨论】:

做到了!谢啦!我将(非常简单的)代码解决方案附加到答案中,以方便任何人寻找将代码合并到他们的项目中。

以上是关于如何从 iOS 键盘扩展中检测到通过在 iMessage 中点击“发送”等操作清除了文本字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测在 iOS 8 上包含应用程序时启用了应用程序扩展?

如何检测是否从键盘的容器应用程序激活自定义键盘?

IOS 8 App Group 访问键盘扩展中的容器应用程序文件

在自定义键盘扩展中检测输入对象视图类型

iOS通过代码将默认键盘从ABC模式切换到123模式?

Xamarin / iOS - 如何从硬件键盘禁用选项卡键码