无论如何要在我的应用程序中捕获所有键盘事件吗?我需要知道用户是否在我的应用程序中使用键盘输入任何内容(应用程序有多个视图)。我能够通过子类化 UIWindow 来捕获 touchEvents,但无法捕获键盘事件。
问问题
14080 次
3 回答
14
使用 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]);
}
于 2009-08-13T06:46:14.097 回答
12
我在我的博客中写了关于使用 UIEvent 的小技巧来捕捉事件的文章
详情请参考: 在 iOS 中捕捉键盘事件。
从上面提到的博客:
诀窍是直接访问 GSEventKey 结构内存并检查某些字节以了解所按下键的键码和标志。下面的代码几乎是不言自明的,应该放在你的 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];
}
}
}
}
}
于 2012-01-14T14:28:43.020 回答
2
不是一个简单的答案,但我认为您有两种方法可用。
像对 UIWindow 所做的那样,对输入组件(UITextView、UITextField 等)进行子类化。
创建一个应用程序范围的 UITextViewDelegate(和 UITextFieldDelegate)并将所有输入字段委托分配给它。
于 2009-08-12T18:11:31.767 回答