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
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]);
}
Keine einfache Antwort, aber ich denke, Sie haben zwei Ansätze zur Verfügung.
Unterklasse der Eingangskomponenten (UITextView, UITextField, etc.), wie Sie mit dem UIWindow getan haben.
Erstellen Sie eine anwendungsweite UITextViewDelegate (und UITextFieldDelegate) und weisen Sie alle Ihre Eingabefeld Delegaten zu ihm.
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];
}
}
}
}
}
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). –
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
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
Das ist etwas schwierig jetzt und beinhaltet eine Menge Arbeit. Ich hatte gehofft, ein Ereignis auf App-Ebene zu sehen, um – iamMobile