¿Hay alguna forma de atrapar todos los eventos de teclado en mi aplicación? Necesito saber si el usuario ingresa algo usando el teclado en mi aplicación (la aplicación tiene múltiples vistas). Pude capturar TouchEvents subclasificando UIWindow pero no pude capturar eventos de teclado.Recibir eventos de teclado de iPhone
Respuesta
Uso 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]);
}
No es una respuesta simple, pero creo que tiene dos enfoques disponibles.
subclase los componentes de entrada (UITextView, UITextField, etc.) como lo ha hecho con el UIWindow.
crear una amplia UITextViewDelegate aplicación (y UITextFieldDelegate) y asignar todos los delegados de campo de entrada a la misma.
me escribió acerca de la captura de eventos usando un pequeño programa de UIEvent en mi Blog
Por favor, consulte: Catching Keyboard Events in iOS para más detalles.
Desde el blog mencionado anteriormente:
El truco está en acceder a la memoria GSEventKey estructura directamente y comprobar ciertos bytes saber el código clave y las banderas de la tecla pulsada. Debajo de , el código es casi autoexplicativo y debe colocarse en su subclase 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];
}
}
}
}
}
Consulte ["¿Cómo podría escribir mi respuesta que vincula correctamente los enlaces a un recurso externo?"] (Http://meta.stackexchange.com/questions/94022/how-could -i-write-my-answer-that-links-to-an-external-resource-proper). –
No entiendo lo que tengo -1. Sí, el enlace es a una publicación de mi blog, pero responde completamente esta pregunta. Captura TODOS los eventos del teclado, incluidos Shift, Cmd, Ctrl, Alt. Si es por el uso de Private API, claramente dije que es un ** hack **. No estoy engañando a nadie aquí. – nacho4d
Probablemente porque su respuesta no responde a la pregunta, simplemente apunta a una fuente externa que puede desaparecer, romperse o simplemente cambiar más allá de esta pregunta. Como señala Anna Lear, lea la sección que señaló. La respuesta apunta a lo siguiente como las reglas adecuadas a seguir: - parafrasea el contenido del elemento vinculado (posiblemente omitiendo detalles o ejemplos) - identifica al autor (usted mismo, MSDN, etc.) - alguien podría beneficiarse del responder sin leer el elemento vinculado en absoluto - incluye información para dejar que el lector decida si hacer clic en el enlace vale la pena – Coyote
- 1. Cocos2d - Mac: ¿busca eventos de teclado?
- 2. Cómo recibir NSUserDefaultsDidChangeNotification iPhone
- 3. Teclado de iPhone personalizado
- 4. Leer eventos de teclado en Android WebView
- 5. iPhone - El teclado oculta TextField
- 6. Teclado numérico predeterminado de iPhone
- 7. atajos de teclado iPhone/iPad?
- 8. Eventos de teclado de consola C++
- 9. Propagación de eventos de teclado en winforms
- 10. javascript: Cómo depurar eventos de teclado
- 11. teclado procesador de eventos En JavaScript
- 12. ¿Escuchando eventos de teclado sin atraparlos?
- 13. Enviar eventos de mouse y teclado
- 14. teclado de iphone sin vista de texto
- 15. Android BroadcastReceiver no puede recibir eventos de difusión
- 16. ¿Cómo recibir notificaciones para eventos de tarjetas SD?
- 17. Práctica recomendada para UI Notificaciones de teclado - SDK de iPhone
- 18. aplicación iPhone/iPad usando atajos de teclado?
- 19. iPhone datepicker en lugar de teclado?
- 20. iPhone: Bloques de teclado en pantalla
- 21. iPhone 5 Tamaño del teclado
- 22. Personalización del teclado del iPhone
- 23. Activación manual del teclado de iPhone/iPad/iPod desde JavaScript
- 24. adjuntar eventos del teclado al lienzo html5
- 25. Retraso de hilo y eventos de teclado en OCaml
- 26. ¿Es posible detectar eventos de enfoque de teclado globalmente?
- 27. Hoja de documento que no responde a eventos de teclado
- 28. Cómo recibir UIAccessibilityNotifications en la aplicación de iPhone
- 29. Javascript Eventos: recibir notificaciones de cambios en un valor <input> de control
- 30. Envío de eventos de teclado a otra aplicación en C# que no maneja eventos de Windows
Esto es poco complicado ahora e implica mucho trabajo. Esperaba ver algún evento de nivel de aplicación para capturar – iamMobile