2013-02-22 2 views
6

Как ответить , начинающийся диктант?


Известные способы реагирования диктовку:Использование диктовки - iOS 6 - DidStart?

  • dictationRecordingDidEnd - реагирующие на завершения признания в диктуемой фразу.

  • диктофонRecognitionFailed - ответить на не удалось признание диктовки.


Ссылка: UITextInput Справочник по протоколу

Начиная с прошивкой 5.1, когда пользователь выбирает вход диктант на поддерживаемом устройстве, система автоматически вставляет фразы признаются в текущем виде текста. Методы в протоколе UITextInput позволяют вашему приложению отвечать на завершение диктовки, как описано в «Использование диктовки». Вы можете использовать объект класса UIDictationPhrase для получения строки, представляющей фразу, которую продиктовал пользователь. В случае неоднозначных результатов диктовки объект фразовой фразы предоставляет массив, содержащий альтернативные строки.

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextInput_Protocol/Reference/Reference.html

ответ

10

Насколько я могу сказать, что нет никакого публичного API для обнаружения, когда диктант начал.

Если вы действительно хотите сделать это, и вы хотите быть в App Store, вы, вероятно, можете уйти со следующим подходом, но это совершенно не поддерживается, это может заставить вас отклонили все равно , и , вероятно, переломит будущую версию iOS.

В текстовой системе размещены недокументированные уведомления после, изменяющиеся на или с клавиатуры «с клавиатуры». Два из них размещены как на смену ему и изменение от него, с этими именами:

  • UIKeyboardCandidateCorrectionDidChangeNotification
  • UIKeyboardLayoutDidChangedNotification

Обратите внимание, что вторая одна имеет странное спряжения глаголов , Это не опечатка. (Ну, это не мой опечатка.)

Эти уведомления также публикуются в другое время, поэтому вы не можете просто наблюдать за ними и предполагать, что состояние диктовки изменилось. Когда вы получите уведомление, вам нужно будет сделать больше проверки. Итак, добавьте себя в качестве наблюдателя из одного из этих уведомлений. Первый кажется менее вероятным уйти или переименоваться в будущем.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(checkForDictationKeyboard:) 
     name:@"UIKeyboardCandidateCorrectionDidChangeNotification" 
     object:nil]; 
    ... 

Когда вы получите уведомление, вы хотите увидеть, выполняется ли показ вид диктанта:

- (void)checkForDictationKeyboard:(NSNotification *)note { 
    if ([self isShowingDictationView]) { 
     NSLog(@"showing dictation view"); 
    } else { 
     NSLog(@"not showing dictation view"); 
    } 
} 

Чтобы убедиться в том, что это показывает, проверить каждое окно, кроме вашего собственного окна приложения. Обычно единственным окном является окно текстовой системы.

- (BOOL)isShowingDictationView { 
    for (UIWindow *window in [UIApplication sharedApplication].windows) { 
     if (window == self.window) 
      continue; 
     if (containsDictationView(window)) 
      return YES; 
    } 
    return NO; 
} 

Рекурсивный ходить по иерархии вида проверки для представления, имя класса содержит строку «DictationView». Фактическое имя класса - UIDictationView, но, не используя все имя, вы вряд ли будете отвергнуты из App Store.

static BOOL containsDictationView(UIView *view) { 
    if (strstr(class_getName(view.class), "DictationView") != NULL) 
     return YES; 
    for (UIView *subview in view.subviews) { 
     if (containsDictationView(subview)) 
      return YES; 
    } 
    return NO; 
} 
10

Несмотря на то, что на этот вопрос ответил, я все же хочу добавить свое решение и хочу быть полезным кому-то другому.

Когда вы нажимаете на кнопку MIC на клавиатуре, primaryLanguage изменится на dictation. Вы можете обнаружить, что, как это:

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

- (void) handleCurrentInputModeDidChange:(NSNotification *)notification 
{ 
    NSString *primaryLanguage = [UITextInputMode currentInputMode].primaryLanguage; 

    NSLog(@"current primaryLanguage is: %@", primaryLanguage); 
} 

UPDATE: Так же, как то, что @ user1686700 сказал, currentInputMode уже устарела. Это уже не решение.

+0

Отличное решение. – AriX

+0

Я мог бы быть отличным решением, но он не работает, см. [Мой вопрос] (http://stackoverflow.com/q/24041181/1387438), с этим решением я все еще не могу избавиться от сбоя. –

4

Обратите внимание: UITextInputMode's currentInputMode устарел с iOS7. Мы можем просто подождать, пока Apple решит опубликовать API диктовки, чтобы мы могли делать вызовы, которые имеют смысл в соответствии с нашими намерениями.