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

时间:2014-06-04 15:11:11

标签: ios uitextfield speech-to-text

问题:

我与UITextField并排UIButton并具有发送功能。当用户按下发送按钮时,我正在执行简单的操作:

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

现在当用户开始在键盘上使用听写时,然后在听写视图(键盘)上按下并立即按下发送按钮,我有异常“范围或索引越界”。

可能的解决方案:

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

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

类似主题:

我尝试了什么:

  1. 只是捕获并忽略异常。
  2. ,崩溃没有恢复,但虚拟键盘变得完全没有反应
  3. [UITextInputMode currentInputMode].primaryLanguage等于@"dictation"时禁用发送按钮。报告听写结束模式的通知UITextInputCurrentInputModeDidChangeNotification在听写服务提交新值之前到达,我仍然可以单击发送按钮以引发异常。我可以在primaryLanguage损失@“听写”值时增加延迟,但我不喜欢这种方法。很可能这种所需的延迟取决于语音识别服务的响应程度。
  4. 我在不同的事件上添加了一系列操作(这个evets正在寻找处理:UIControlEventEditingDidBeginUIControlEventEditingChangedUIControlEventEditingDidEndUIControlEventEditingDidEndOnExit)。好消息是,UIControlEventEditingChanged看起来恰好在所需的时刻被激发:当用户在听写视图上按“完成”并且服务正在提交或结束听写时。所以这是我迄今为止最好的概念。 坏事是在其他情况下也会被触发,并且没有信息可以区分这种控制事件被触发的情况,所以我不知道应该禁用或启用按钮还是执行此操作什么都没有。

2 个答案:

答案 0 :(得分:6)

我终于找到了最终的解决方案。

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

-(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;
}

<小时/>

旧方法

Finlay我找到了一些解决方案。这是改进的概念nr 3,混合了概念nr 2(基于that answer)。

-(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 ...

现在问题没有出现,因为用户在可能发生时被阻止(恰好在用户按下听写视图上的“完成”按钮和结果来自语音识别服务之间。) 好处是使用公共API(只有@“听写”可能是一个问题,但我认为它应该被Apple接受)。

答案 1 :(得分:1)

在iOS 7中,Apple推出了TextKit,因此有关此问题的新信息: NSAttachmentCharacter = 0xfffc 用于表示附件documentation表示。

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

相关问题