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
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]);
}
Nie jest to prosta odpowiedź, ale wydaje mi się, że dostępne są dwa podejścia.
podklasa elementy wejściowe (UITextView, UITextField, etc), jak zrobiłeś z UIWindow.
Utwórz aplikację szerokim UITextViewDelegate (i UITextFieldDelegate) i przypisz do niego wszystkich swoich uczestników.
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];
}
}
}
}
}
. 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). –
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
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
To jest trochę trudne i teraz obejmuje wiele pracy. Miałem nadzieję, że zobaczę zdarzenie na poziomie aplikacji, aby uchwycić – iamMobile