4

我目前面临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?是否有另一种方法来检测语音识别仍在运行?

4

2 回答 2

3

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

这与您所描述的完全一样:从textDidChange您得到一个长度为 1的NSString

就我而言,我的解决方案是获取文本的第一个字符(如果可用)并检查它的整数值。显然,“处理语音输入”的值始终是-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;
       }
    }
}
于 2013-10-01T12:31:01.853 回答
0

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

于 2014-05-20T09:01:36.007 回答