2013-02-22 10 views
6

Wie reagiert man auf ab Diktat?


Bekannte Möglichkeiten, um Diktat reagiert:Verwenden von Diktat - iOS 6 - DidStart?

  • dictationRecordingDidEnd - reagieren auf den Abschluss der Anerkennung einer diktierte Phrase.

  • dictationRecognitionFailed - reagieren auf fehlgeschlagen Diktiererkennung.


Referenz: UITextInput Protokollreferenz

Ab iOS 5.1, wenn der Benutzer Diktat Eingang auf einem unterstütztes Gerät wählt, fügt das System automatisch Phrasen in die aktuelle Textansicht erkannt. Methoden im UITextInput-Protokoll ermöglichen es Ihrer App, auf die Beendigung des Diktats zu reagieren, wie unter "Verwenden von Diktaten" beschrieben. Sie können ein Objekt der UIDictationPhrase-Klasse verwenden, um eine Zeichenfolge zu erhalten, die eine vom Benutzer diktierte Phrase darstellt. Bei mehrdeutigen Diktat-Ergebnissen stellt ein Diktat-Phrasen-Objekt ein Array bereit, das alternative Strings enthält.

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

Antwort

10

Soweit ich das beurteilen kann, gibt es keine öffentliche API zum Erfassen, wenn Diktat begonnen hat.

Wenn Sie wirklich es tun wollen, und Sie wollen in den App Store sein, können Sie wahrscheinlich mit dem folgenden Ansatz weg, aber es ist völlig ungestützt, es könnte erhalten Sie abgelehnt sowieso und ist es wahrscheinlich, in einer zukünftigen Version von iOS zu brechen.

Das Textsystem sendet einige undokumentierte Benachrichtigungen nach Änderung an oder aus dem Diktat "Tastatur". Zwei von ihnen gebucht wird sowohl auf einer Änderung, um es und eine Änderung von ihm, mit diesem Namen:

  • UIKeyboardCandidateCorrectionDidChangeNotification
  • UIKeyboardLayoutDidChangedNotification

Beachten Sie, dass der zweite eine seltsame Konjugation hat . Das ist kein Tippfehler. (Nun, es ist nicht mein Tippfehler.)

Diese Hinweise werden auch zu anderen Zeiten gepostet, so dass Sie nicht nur beobachten können und davon ausgehen, dass der Diktatstatus geändert hat. Sie müssen mehr Prüfungen durchführen, wenn Sie die Benachrichtigung erhalten. Fügen Sie sich als Beobachter einer dieser Benachrichtigungen hinzu. Die erste scheint weniger wahrscheinlich wegzugehen oder in Zukunft umbenannt zu werden.

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

Wenn Sie die Meldung erhalten, werden Sie sehen wollen, ob das Diktat Ansicht zeigt:

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

Um zu sehen, ob es zeigt, überprüfen Sie jedes Fenster außer Ihrer eigenen Anwendungsfenster. Normalerweise ist das einzige andere Fenster das Fenster des Textsystems.

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

Recursively die Ansicht Hierarchie gehen für einen Blick überprüft, deren Klassennamen enthält die Zeichenfolge „DictationView“. Der tatsächliche Klassenname lautet UIDictationView. Wenn Sie jedoch nicht den gesamten Namen verwenden, werden Sie weniger wahrscheinlich aus dem App Store abgelehnt.

10

Obwohl diese Frage beantwortet wird, möchte ich immer noch meine Lösung hinzufügen und möchte jemand anderen helfen.

Wenn Sie auf die MIC-Taste auf der Tastatur tippen, wechselt primaryLanguage zu dictation. Sie können das wie folgt ermitteln:

[[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: Genau wie das, was @ user1686700 sagte currentInputMode bereits veraltet. Dies ist keine Lösung mehr.

+0

Große Lösung. – AriX

+0

Ich könnte eine gute Lösung sein, aber es funktioniert nicht, siehe [meine Frage] (http://Stackoverflow.com/q/24041181/1387438), mit dieser Lösung kann ich immer noch nicht crash loswerden. –

4

Bitte beachten Sie - currentInputMode von UITextInputMode ist ab iOS7 veraltet. Möglicherweise müssen wir nur warten, bis Apple die Diktier-API veröffentlicht, damit wir die Anrufe tätigen können, die nach unseren Absichten sinnvoll sind.