如何检测语音识别正在进行中

问题:

我有UITextFieldUIButton与发送function并排。 当用户按下发送button,我正在执行简单的操作:

 - (IBAction)sendMessage: (id)sender { [self.chatService sendMessage: self.messageTextField.text]; self.messageTextField.text = @""; // here I get exception } 

现在当用户从键盘开始使用听写时,然后按听写视图(键盘)上的button,并立即按下发送button,我有exception“范围或索引超出界限”。

可能的scheme

我注意到,当语音识别服务器正在处理数据时,其他应用程序禁用此“发送”button。 这恰好在两个事件之间:用户按“完成”,结果出现在文本字段中。 我希望以同样的方式解决它。

我在文档中发现可以收到此通知的问题。 我find了UITextInput协议,但这不是我所需要的。

类似主题:

  • 使用听写 – iOS 6 – DidStart – 解决scheme不可接受(可能被苹果拒绝)
  • 禁用iPhone 4S /新iPad的键盘上的听写button – 与上述类似的方法

我试过了什么:

  1. 简单地捕捉并忽略exception。 崩溃不起作用,但虚拟键盘变得完全没有反应
  2. [UITextInputMode currentInputMode].primaryLanguage等于@"dictation"时,禁用发送button。 通知UITextInputCurrentInputModeDidChangeNotification报告听写模式结束之前到达听写服务提交新值,我仍然可以点击发送button引起exception。 当primaryLanguage损失@“听写”价值时,我可以加延迟,但我不喜欢这种方法。 这个所需的延迟很可能取决于语音识别服务的响应程度。
  3. 我已经添加了一堆行动在不同的事件(这evets正在处理: UIControlEventEditingDidBeginUIControlEventEditingChangedUIControlEventEditingDidEndUIControlEventEditingDidEndOnExit )。 好处是,它看起来像UIControlEventEditingChanged正好在预期的时刻触发:当用户在听写视图上按下“完成”,当服务是提交或结束听写。 所以这是我迄今为止最好的概念。 坏事是,这也是在其他情况下被解雇,并没有信息来区分这种控制事件被解雇,所以我不知道应该禁用或启用button或什么都不做。

我终于find最终解决scheme。

它简单优雅将通过苹果审查,它总是工作。 只需在UIControlEventEditingChanged做出反应,并检测replace字符的存在如下所示:

 -(void)viewDidLoad { [super viewDidLoad]; [self.textField addTarget: self action: @selector(eventEditingChanged:) forControlEvents: UIControlEventEditingChanged]; } -(IBAction)eventEditingChanged:(UITextField *)sender { NSRange range = [sender.text rangeOfString: @"\uFFFC"]; self.sendButton.enabled = range.location==NSNotFound; } 

老办法

芬莱我find了一些解决scheme。 这是改进的概念nr 3与概念nr 2(基于该答案 )的混合。

 -(void)viewDidLoad { [super viewDidLoad]; [self.textField addTarget: self action: @selector(eventEditingChanged:) forControlEvents: UIControlEventEditingChanged]; } -(IBAction)eventEditingChanged:(UITextField *)sender { NSString *primaryLanguage = [UITextInputMode currentInputMode].primaryLanguage; if ([primaryLanguage isEqualToString: @"dictation"]) { self.sendButton.enabled = NO; } else { // restore normal text field state self.sendButton.enabled = self.textField.text.length>0; } } - (IBAction)sendMessage: (id)sender { [self.chatService sendMessage: self.messageTextField.text]; self.messageTextField.text = @""; } - (BOOL)textFieldShouldReturn:(UITextField *)textField { if (self.textField.text.length==0 || !self.sendButton.enabled) { return NO; } [self sendMessage: textField]; return YES; } // other UITextFieldDelegate methods ... 

现在问题不会出现,因为用户在可能发生时被阻止(在用户按下听写视图中的“完成”button之后,以及来自语音识别服务的结果时。
好的是,公共API被使用(只有@“听写”可能是一个问题,但我瘦它应该被苹果接受)。

在iOS 7中,Apple引入了TextKit,所以这个问题有了新的信息: NSAttachmentCharacter = 0xfffc用来表示文档中的附件。

因此,如果您的版本大于或等于7.0 ,则更好的方法是检查用于附件的属性string。