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

Sli*_*ady 5 uisearchbar ios

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

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

我得到这个日志结果:

\n\n
SearchText [\xef\xbf\xbc] - SearchTextLength [1] - SearchTextEquals [0]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我被困在这一点上。怎么可能searchText是[](空)但长度为1?还有其他方法可以检测语音识别仍在运行吗?

\n

Fme*_*ina 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;
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此答案中检测到的 -17 实际上是 UNICODE 对象替换字符的第一个字节。如果检测到它,则必须检测整个多字节字符,在本例中为“\xef\xbf\xbc”。-17 是“\xef”字节。如果您只检测第一个字节,您将得到诸如朝鲜文和武士刀字符以及国际货币符号之类的误报 - 例如日元是“\xef\xbf\xa5”。该字符也可以出现在字符串中的任何位置,因此您必须对其进行迭代。 (2认同)