当前位置 : 主页 > 手机开发 > ios >

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

来源:互联网 收集:自由互联 发布时间:2021-06-11
问题: 我有UITextField与UIButton并排发送功能.当用户按下发送按钮时,我正在执行简单的操作: - (IBAction)sendMessage: (id)sender { [self.chatService sendMessage: self.messageTextField.text]; self.messageTextFiel
问题:

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

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

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

可能的方法:

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

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

类似主题:

> Using Dictation – iOS 6 – DidStart – 解决方案不可接受(苹果可能拒绝)
> Disable Dictation button on the keyboard of iPhone 4S / new iPad – 与上述类似的方法

我试过了什么:

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

我终于找到了终极解决方案

它简单优雅将通过苹果审查,它始终工作.只需对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接受).

网友评论