如何检测textDidChange:在UISearchBar上由听写触发

时间:2013-09-11 07:51:48

标签: ios uisearchbar

我目前面临与UISearchBar和听写支持相关的问题。当搜索栏的文本发生变化时,我必须触发一些过滤器逻辑。必须通过键盘输入或听写来触发此逻辑。

现在我的问题是:如果我在搜索栏中结束听写,则会立即触发textDidChange方法(语音识别正在运行)。识别完成后,再次使用正确的字符串触发该方法。

如何通过语音识别的开始检测到方法的第一次调用?因为在这种情况下我必须避免执行我的逻辑。

我已经尝试检查传递给该方法的searchText参数。但结果有点可疑。

如果我将此代码添加到searchBar:textDidChange:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    NSLog(@"SearchText [%@] - SearchTextLength [%i] - SearchTextEquals [%i]", searchText, searchText.length, [searchText isEqualToString:@""]);
}

我收到了这个日志结果:

SearchText [] - SearchTextLength [1] - SearchTextEquals [0]

我在这一点上陷入困​​境。 searchText如何[](空)但长度为1?还有另一种检测语音识别仍在运行的方法吗?

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题:检测到语音听写仍在运行并处理语音输入。

这与你描述的完全一样:从 textDidChange 你得到 NSString 长度= 1

就我而言,我的解决方案是获取文本的第一个字符(如果可用)并检查它的整数值。显然,“处理语音输入”的值始终为 -17

我知道这不是一个完美的解决方案,但它确实有效。如果有人有更好的解决方案,请分享:)

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    BOOL atLeastOneChar = searchText.length > 0;
    BOOL speechRecognitionOngoing;

    if (atLeastOneChar) {
       // Checking if the user used the dictation feature. 
       // A char of value -17 is always returned as text while processing the voice.
       // So if the first char is == -17 it means the dictationg is going on.

       const char firstChar = *text.UTF8String;
       NSInteger processingDictationSpeechChar = -17;
       if (firstChar == processingDictationSpeechChar) {
           // --> speech recognition is ongoing!
           speechRecognitionOngoing = YES;
       }
    }
}

答案 1 :(得分:0)

您可以使用[UITextInputMode currentInputMode].primaryLanguage;检测正在进行的听写 - 在听写正在进行时返回dictation,因为在听写正在进行时与波形的灰色叠加是从键盘的角度来看该应用程序。您还可以通过收听UITextInputCurrentInputModeDidChangeNotification来检测更改。