问题:
我有一个UITextField
和一个带有发送功能的UIButton
并排放置。当用户按下发送按钮时,我执行简单的操作:
- (IBAction)sendMessage: (id)sender {
[self.chatService sendMessage: self.messageTextField.text];
self.messageTextField.text = @""; // here I get exception
}
现在,当用户从键盘开始使用语音输入时,然后在语音输入视图(键盘)上按下“完成”并立即按下发送按钮时,我遇到了异常“范围或索引超出界限”。
可能的解决方案:
我注意到其他应用程序在语音识别服务器正在处理数据时禁用此“发送”按钮。这正好处于两个事件之间:用户按下“完成”和结果出现在文本字段中。我希望以同样的方式解决它。
我在文档中找不到可以接收此通知的位置。我找到了UITextInput
协议,但这不是我需要的。
类似主题:
- 使用语音输入-iOS 6-DidStart - 解决方案不可接受(可能会被苹果拒绝)
- 在iPhone 4S /新iPad的键盘上禁用语音输入按钮 - 与上述方法类似
我尝试过什么:
- 简单地捕获并忽略异常。程序没有崩溃,但虚拟键盘完全无响应。
- 当
[UITextInputMode currentInputMode].primaryLanguage
等于@"dictation"
时禁用发送按钮。通知UITextInputCurrentInputModeDidChangeNotification
在语音输入服务提交新值之前报告了听写模式的结束,此时我仍然可以点击发送按钮导致异常。我可以在primaryLanguage
失去 @"dictation" 值时添加延迟,但我不喜欢这种方法。最有可能需要延迟的时间取决于语音识别服务的响应速度。 - 我已经在不同事件上添加了一堆操作(这些事件看起来像是处理:
UIControlEventEditingDidBegin
、UIControlEventEditingChanged
、UIControlEventEditingDidEnd
、UIControlEventEditingDidEndOnExit
)。好消息是,看起来UIControlEventEditingChanged
恰好在所需的时刻触发:当用户在听写视图上按下 "完成" 按钮和服务正在提交或结束听写时。因此,这是我目前最好的概念。坏消息是,这也会在其他情况下触发,并且没有信息可以区分在哪种情况下触发了此控件事件,因此我不知道应该禁用还是启用按钮或什么都不做。