7

无论如何要在我的应用程序中捕获所有键盘事件吗?我需要知道用户是否在我的应用程序中使用键盘输入任何内容(应用程序有多个视图)。我能够通过子类化 UIWindow 来捕获 touchEvents,但无法捕获键盘事件。

4

3 回答 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

不是一个简单的答案,但我认为您有两种方法可用。

  1. 像对 UIWindow 所做的那样,对输入组件(UITextView、UITextField 等)进行子类化。

  2. 创建一个应用程序范围的 UITextViewDelegate(和 UITextFieldDelegate)并将所有输入字段委托分配给它。

于 2009-08-12T18:11:31.767 回答