首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用UIKeyCommand检测连续按键

用UIKeyCommand检测连续按键
EN

Stack Overflow用户
提问于 2014-01-09 12:51:25
回答 4查看 3.7K关注 0票数 15

有可能得到连续的按键吗?

我使用keyCommands:来拦截在外部键盘上按下的箭头键,但是每次按下我只能收到一个调用。只要按住键,我希望每隔X毫秒就有多个调用,或者在按下键和释放键时调用。

这是我的密码:

代码语言:javascript
复制
- (NSArray *)keyCommands
{
    UIKeyCommand *upArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputUpArrow
                                                modifierFlags:0
                                                       action:@selector(upArrow:)];
    UIKeyCommand *downArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputDownArrow
                                                  modifierFlags:0
                                                         action:@selector(downArrow:)];
    UIKeyCommand *leftArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputLeftArrow
                                                  modifierFlags:0
                                                         action:@selector(leftArrow:)];
    UIKeyCommand *rightArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputRightArrow
                                                   modifierFlags:0
                                                          action:@selector(rightArrow:)];
    UIKeyCommand *leftArrowCmd = [UIKeyCommand keyCommandWithInput:UIKeyInputLeftArrow
                                                     modifierFlags:UIKeyModifierCommand
                                                            action:@selector(leftArrowCmd:)];
    UIKeyCommand *rightArrowCmd = [UIKeyCommand keyCommandWithInput:UIKeyInputRightArrow
                                                      modifierFlags:UIKeyModifierCommand
                                                             action:@selector(rightArrowCmd:)];
    UIKeyCommand *lCmd = [UIKeyCommand keyCommandWithInput:@"l"
                                             modifierFlags:UIKeyModifierCommand
                                                    action:@selector(lCmd:)];
    UIKeyCommand *rCmd = [UIKeyCommand keyCommandWithInput:@"r"
                                             modifierFlags:UIKeyModifierCommand
                                                    action:@selector(rCmd:)];
    UIKeyCommand *mCmd = [UIKeyCommand keyCommandWithInput:@"m"
                                             modifierFlags:UIKeyModifierCommand
                                                    action:@selector(mCmd:)];
    return @[upArrow, downArrow, leftArrow, rightArrow, leftArrowCmd, rightArrowCmd, lCmd, rCmd, mCmd];
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-14 10:44:40

似乎这在iOS 7中是不可能的。

票数 6
EN

Stack Overflow用户

发布于 2015-01-09 09:52:58

可以连续按下键,因为当您在键盘上按下一个键时,首先调用keyCommands,然后在释放该键后再次调用该方法。但是,您无法判断用户是在释放一个键还是按下另一个键,而仍然按住第一个键,所以您可以做的事情是有限制的。

只要您的应用程序不要求用户同时按下多个键,这个限制应该是可以的。如果您可以假设用户一次只按一个键,您可以使用它来连续按下键。

编辑:我得到的评论是,这似乎是一个错误的陈述。那是不对的!下面是一个完整的例子:

代码语言:javascript
复制
#import "ViewController.h"

@interface ViewController ()
{
    bool keyDown;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    keyDown = NO;
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (NSArray*)keyCommands
{
    if(keyDown==YES) {
        printf("Key released\n");
        keyDown = NO;
    }
    UIKeyCommand *upArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputUpArrow
                                                modifierFlags:0
                                                       action:@selector(upArrow:)];
    return @[upArrow];
}

-(void)upArrow:(UIKeyCommand*)keyCommand
{
    printf("Key pressed\n");
    keyDown = YES;
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}
@end

当您按下向上箭头按钮时,您将在输出控制台中看到文本“按下”键。当您释放它时,您将看到文本“键已释放”。正如我提到的,有一个限制。如果您持有向上箭头,然后同时按另一个键,代码将假定向上箭头键已经释放。

当您按下并按住向上箭头键时,会发生这样的情况:

  1. 首先,方法keyCommands将被调用两次(为什么是两次?)
  2. upArrow方法将被调用一次,变量keyDown将被设置为YES,文本“按下”将被打印出来。

当您释放密钥时会发生这样的情况:

  1. 方法keyCommands将被调用一次。文本“键释放”将打印自keyDown=YES。

正如我前面提到的,这个方法有一个限制;如果您首先按下向上箭头并在按另一个按钮时按住它,则此代码将相信您已经释放了向上箭头按钮。显然,您需要用一个计时器来结束这个过程,以便在您的应用程序中连续按下键。

票数 4
EN

Stack Overflow用户

发布于 2015-10-26 06:55:13

专业提示-我的箭头键被阻塞了,因为我从

代码语言:javascript
复制
-(BOOL) canPerformAction:(SEL)action withSender:(id)sender 

确保检查您自己创建的选择器。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21020814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档