2009-08-12 2 views
6

Gibt es sowieso alle Tastaturereignisse in meiner Anwendung abfangen? Ich muss wissen, ob Benutzer irgendetwas über die Tastatur in meiner Anwendung eingeben (Anwendung hat mehrere Ansichten). Ich konnte touchEvents erfassen, indem ich UIWindow ableierte, aber keine Tastaturereignisse erfassen konnte.Empfangen iPhone Tastaturereignisse

Antwort

13

Verwenden NSNotificationCenter

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyPressed:) name: UITextFieldTextDidChangeNotification object: nil]; 

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyPressed:) name: UITextViewTextDidChangeNotification object: nil]; 

........ 

-(void) keyPressed: (NSNotification*) notification 
{ 
    NSLog([[notification object]text]); 
} 
2

Keine einfache Antwort, aber ich denke, Sie haben zwei Ansätze zur Verfügung.

  1. Unterklasse der Eingangskomponenten (UITextView, UITextField, etc.), wie Sie mit dem UIWindow getan haben.

  2. Erstellen Sie eine anwendungsweite UITextViewDelegate (und UITextFieldDelegate) und weisen Sie alle Ihre Eingabefeld Delegaten zu ihm.

+0

Das ist etwas schwierig jetzt und beinhaltet eine Menge Arbeit. Ich hatte gehofft, ein Ereignis auf App-Ebene zu sehen, um – iamMobile

10

Ich schrieb über die Ereignisse zu kontrollieren einen kleinen Hack von UIEvent in meinem Blog

entnehmen Sie bitte mit: Catching Keyboard Events in iOS für weitere Einzelheiten.

Aus dem obigen Blog erwähnt:

Der Trick ist GSEventKey struct Speicher direkt und überprüfen bestimmte Bytes Zugriff auf den Schlüsselcode und Flaggen der gedrückten Taste kennen. Unter Code ist fast selbsterklärend und sollte in Ihre UIApplication Unterklasse gesetzt werden.

#define GSEVENT_TYPE 2 
#define GSEVENT_FLAGS 12 
#define GSEVENTKEY_KEYCODE 15 
#define GSEVENT_TYPE_KEYUP 11 

NSString *const GSEventKeyUpNotification = @"GSEventKeyUpHackNotification"; 

- (void)sendEvent:(UIEvent *)event 
{ 
    [super sendEvent:event]; 

    if ([event respondsToSelector:@selector(_gsEvent)]) { 

     // Key events come in form of UIInternalEvents. 
     // They contain a GSEvent object which contains 
     // a GSEventRecord among other things 

     int *eventMem; 
     eventMem = (int *)[event performSelector:@selector(_gsEvent)]; 
     if (eventMem) { 

      // So far we got a GSEvent :) 

      int eventType = eventMem[GSEVENT_TYPE]; 
      if (eventType == GSEVENT_TYPE_KEYUP) { 

       // Now we got a GSEventKey! 

       // Read flags from GSEvent 
       int eventFlags = eventMem[GSEVENT_FLAGS]; 
       if (eventFlags) { 

        // This example post notifications only when 
        // pressed key has Shift, Ctrl, Cmd or Alt flags 

        // Read keycode from GSEventKey 
        int tmp = eventMem[GSEVENTKEY_KEYCODE]; 
        UniChar *keycode = (UniChar *)&tmp; 

        // Post notification 
        NSDictionary *inf; 
        inf = [[NSDictionary alloc] initWithObjectsAndKeys: 
         [NSNumber numberWithShort:keycode[0]], 
         @"keycode", 
         [NSNumber numberWithInt:eventFlags], 
         @"eventFlags", 
         nil]; 
        [[NSNotificationCenter defaultCenter] 
         postNotificationName:GSEventKeyUpNotification 
             object:nil 
            userInfo:userInfo]; 
       } 
      } 
     } 
    } 
} 
+1

zu erfassen. Bitte siehe ["Wie könnte ich meine Antwort schreiben, die Links zu einer externen Ressource richtig schreibt?"] (Http://meta.stackexchange.com/questions/94022/how-could -i-schreibe-meine-Antwort-das-Links-zu-einer-externen-Ressource-richtig). –

+0

Ich verstehe nicht, was ich bekommen habe -1. Ja, der Link ist zu einem Beitrag meines Blogs, aber er beantwortet diese Frage vollständig. Es fängt ALLE Tastaturereignisse ab, einschließlich Shift, Cmd, Strg, Alt. Wenn es um die Verwendung von privaten APIs geht, habe ich klargestellt, dass es sich um einen ** Hack ** handelt. Ich täusche niemanden hier herein. – nacho4d

+0

Wahrscheinlich, weil Ihre Antwort die Frage nicht beantwortet, zeigt sie einfach auf eine externe Quelle, die verschwinden kann, kaputt gehen oder einfach über diese Frage hinaus wechseln kann. Wie Anna Lear hervorhebt, lies den Abschnitt, auf den sie zeigte. Die Antwort darauf zu folgenden als die richtigen Regeln zu folgen: - Sie paraphrasieren den Inhalt der verknüpften Artikel (möglicherweise ohne Details oder Beispiele) - Sie identifizieren den Autor (selbst, MSDN, etc) - jemand könnte von der profitieren antworte, ohne den verlinkten Artikel überhaupt zu lesen - du gibst Informationen ein, um den Leser entscheiden zu lassen, ob das Klicken auf den Link lohnend ist – Coyote