将 WatchKit 语音识别的文本发送到另一个界面控制器

Sending WatchKit Voice recognition's text to another interface controller

我在将口述文本发送到另一个界面控制器时遇到问题。

这是我的代码:

- (IBAction)voiceRecognition {

    [self presentTextInputControllerWithSuggestions:nil allowedInputMode:WKTextInputModePlain completion:^(NSArray *results) {

        NSLog(@"results: %@", results);

        NSString *wordKey = [NSString stringWithFormat:@"%@",results];
        NSDictionary *dict = @{@"kWord":wordKey};
        [self pushControllerWithName:@"Dictionary" context:dict];

    }];
}

日志:

Watch Extension[3185:2835671] results: ( Hello )

从其他接口控制器获取数据:

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];

    NSDictionary *dict = (NSDictionary *)context;
    [_word setText:dict[@"kWord"]];

    NSLog(@"The Word is %@",[dict description]);

}

日志:

Watch Extension[3185:2835671] The Word is { kWord = "(\n Hello\n)"; }

这是显示我的问题的屏幕截图:

( 应该显示单词 Hello。我该如何解决这个问题?

您使用 stringWithFormat 数组 格式化为字符串。

这需要 ["Hello"] 并将其正确转换为文字 "(\n Hello\n)"

因为那个字符串有一个换行符,所以不能单行显示。您的 Storyboard WKInterfaceLabel 行数可能设置为 1,因此它只会显示第一行,即 (.

如何解决这个问题?

  • 如果您只对第一个词感兴趣,请使用 results.firstObject 并将该单个词作为 kWord 键的字符串值传递。

    NSDictionary *dict = @{@"kWord": results.firstObject};
    
  • 否则,将整个数组作为值传递,并让目标接口控制器根据需要处理结果数组。

    NSDictionary *dict = @{@"kWord": results};
    

您可能还想更改行数以显示整个听写文本,以处理文本无法放在一行中的情况。

其他选项:

如果您确实打算将口述文本作为单个单词字符串发送,您可以使用

NSString *wordKey = [results componentsJoinedByString:@" "]