2009-08-12 22 views
6

Czy istnieje możliwość pułapkowania wszystkich zdarzeń klawiatury w mojej aplikacji? Muszę wiedzieć, czy użytkownik wprowadza cokolwiek za pomocą klawiatury w mojej aplikacji (aplikacja ma wiele widoków). Udało mi się uchwycić touchEvents, dzieląc podklasę na UIWindow, ale nie mogłem przechwytywać zdarzeń na klawiaturze.Odbieranie zdarzeń klawiatury iPhone'a

Odpowiedz

13

Zastosowanie 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

Nie jest to prosta odpowiedź, ale wydaje mi się, że dostępne są dwa podejścia.

  1. podklasa elementy wejściowe (UITextView, UITextField, etc), jak zrobiłeś z UIWindow.

  2. Utwórz aplikację szerokim UITextViewDelegate (i UITextFieldDelegate) i przypisz do niego wszystkich swoich uczestników.

+0

To jest trochę trudne i teraz obejmuje wiele pracy. Miałem nadzieję, że zobaczę zdarzenie na poziomie aplikacji, aby uchwycić – iamMobile

10

pisałem o przechwytywanie zdarzeń używając trochę hack UIEvent w moim blogu

Patrz: Catching Keyboard Events in iOS szczegóły.

Od powyższej blogu:

Sztuką jest w dostępie do pamięci GSEventKey struct bezpośrednio i sprawdzić pewne bajty znać kod dostępu i flagami wciśniętego klawisza. Poniżej kod jest prawie oczywisty i należy go umieścić pod swoją podklasą UIApplication .

#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

. Zobacz ["Jak mogę napisać odpowiedź, która poprawnie łączy się z zasobem zewnętrznym?"] (Http://meta.stackexchange.com/questions/94022/how-could -i-write-my-answer-that-links-to-an-external-resource-poprawnie). –

+0

Nie rozumiem, co mam -1. Tak, link do posta mojego bloga, ale w pełni odpowiada na to pytanie. Łapie WSZYSTKIE zdarzenia na klawiaturze, w tym Shift, Cmd, Ctrl, Alt. Jeśli jest tak ze względu na używanie prywatnych API, wyraźnie stwierdziłem, że jest to ** hack **. Nie kłuję nikogo tutaj. – nacho4d

+0

Prawdopodobnie dlatego, że twoja odpowiedź nie odpowiada na pytanie, po prostu wskazuje na zewnętrzne źródło, które może zniknąć, zepsuć się lub po prostu zmienić to pytanie. Jak wskazuje Anna Lear, przeczytaj sekcję, którą wskazała. Odpowiedzią na poniższe zasady są następujące zasady: - parafrazujesz zawartość połączonego elementu (ewentualnie pomijając szczegóły lub przykłady) - identyfikujesz autora (siebie, MSDN, itp.) - ktoś może skorzystać z odpowiedź bez czytania połączonego elementu w ogóle - podajesz informacje, które pozwolą czytelnikowi zdecydować, czy kliknięcie linku jest warte zachodu. – Coyote

Powiązane problemy