20

我们是一个医疗保健应用程序。我们在应用程序中有一个符合 HIPAA 标准的语音识别器,通过它可以进行所有听写。医院不希望医生意外开始与不符合 HIPAA 的 Nuance Dragon 服务器通话。所以,我一直在寻找可以抑制键盘上的听写键的方法。

我尝试在键盘上的听写按钮上放置一个假按钮,但在 iPad 上,拆分坞站的概念不断在整个屏幕上移动麦克风。这听起来不像是一个合理的解决方案。有没有专家可以帮助我?

4

5 回答 5

14

好的,终于明白了!诀窍是观察 UITextInputMode 更改通知,然后收集更改模式的标识符(代码似乎避免直接使用 Private API,尽管通常似乎需要一点私有 API 知识),以及模式何时更改听写,resignFirstResponder(这将取消语音听写)。耶!这是一些代码:

在您的应用程序委托中的某个地方(至少那是我放的地方)

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputModeDidChange:) name:@"UITextInputCurrentInputModeDidChangeNotification"
                                           object:nil];

然后你可以

UIView *resignFirstResponder(UIView *theView)
{
    if([theView isFirstResponder])
    {
        [theView resignFirstResponder];
        return theView;
    }
    for(UIView *subview in theView.subviews)
    {
        UIView *result = resignFirstResponder(subview);
        if(result) return result;
    }
    return nil;
}

- (void)inputModeDidChange:(NSNotification *)notification
{        
    // Allows us to block dictation
    UITextInputMode *inputMode = [UITextInputMode currentInputMode];
    NSString *modeIdentifier = [inputMode respondsToSelector:@selector(identifier)] ? (NSString *)[inputMode performSelector:@selector(identifier)] : nil;

    if([modeIdentifier isEqualToString:@"dictation"])
    {
        [UIView setAnimationsEnabled:NO];
        UIView *resigned = resignFirstResponder(window);
        [resigned becomeFirstResponder];
        [UIView setAnimationsEnabled:YES];

        UIAlertView *denyAlert = [[[UIAlertView alloc] initWithTitle:@"Denied" message:nil delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil] autorelease];
        [denyAlert show];
    }
}
于 2012-08-22T18:21:58.980 回答
10

您可以创建自己的键盘并为将接受此听写的文本字段设置 inputView。然后当他们按下任何键时,他们将获得您的键盘,因此您不必覆盖标准键盘上的键,您将能够自定义整个东西。

self.myButton.inputView = self.customKeyboardView;

这是一个非常自定义的键盘示例

http://blog.carbonfive.com/2012/03/12/customizing-the-ios-keyboard/

Ray 还有一个关于自定义键盘的精彩教程。

http://www.raywenderlich.com/1063/ipad-for-iphone-developers-101-custom-input-view-tutorial

我希望这会有所帮助。

于 2012-08-22T18:33:48.737 回答
9

我遇到了同样的问题,我发现隐藏听写按钮的唯一方法是更改​​键盘类型。对我来说,将其更改为电子邮件类型似乎是合理的:

textField.keyboardType = UIKeyboardTypeEmailAddress;
于 2014-12-25T09:37:35.263 回答
1

您可以创建覆盖 insertDictationResult: 的 UITextField/UITextView 的子类,以不插入任何内容。

这不会阻止信息被发送,但您可以显示一个警报,通知他们后膛。

于 2012-08-22T18:54:01.620 回答
0

这是基于@BadPirate 的 hack 的 Swift 4 解决方案。它将触发初始铃声,表明听写开始,但听写布局永远不会出现在键盘上。

这不会隐藏键盘上的听写按钮:因为唯一的选择似乎是使用带有UIKeyboardType.emailAddress的电子邮件布局。


viewDidLoad拥有UITextField要禁用听写的视图控制器中:

// Track if the keyboard mode changed to discard dictation
NotificationCenter.default.addObserver(self,
                                       selector: #selector(keyboardModeChanged),
                                       name: UITextInputMode.currentInputModeDidChangeNotification,
                                       object: nil)

然后自定义回调:

@objc func keyboardModeChanged(notification: Notification) {
    // Could use `Selector("identifier")` instead for idSelector but
    // it would trigger a warning advising to use #selector instead
    let idSelector = #selector(getter: UILayoutGuide.identifier)

    // Check if the text input mode is dictation
    guard
        let textField = yourTextField as? UITextField
        let mode = textField.textInputMode,
        mode.responds(to: idSelector),
        let id = mode.perform(idSelector)?.takeUnretainedValue() as? String,
        id.contains("dictation") else {
            return
    }

    // If the keyboard is in dictation mode, hide
    // then show the keyboard without animations
    // to display the initial generic keyboard
    UIView.setAnimationsEnabled(false)
    textField.resignFirstResponder()
    textField.becomeFirstResponder()
    UIView.setAnimationsEnabled(true)

    // Do additional update here to inform your
    // user that dictation is disabled
}
于 2018-11-20T18:43:23.690 回答