如何从 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
属性的documentContextAfterInput
和documentContextBeforeInput
属性都将为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 上包含应用程序时启用了应用程序扩展?