Iphone IOS中因未知原因导致UI手势失败

Iphone IOS中因未知原因导致UI手势失败,iphone,ios,uiresponder,Iphone,Ios,Uiresponder,我有一个UITextField,它是UIScrollView的子视图 我有一个简单的点击手势(或者可能是老的触摸),作为UITextField的一部分,使它成为第一个响应者。我想在UITextField中添加双击手势。为了使两个手势相互排斥,我需要重载(虽然这不是一个正确的词,因为我没有使用相同的名称)单点击手势。当我这样做时,只要它调用的函数不使UITextField成为第一响应程序,它就可以正常工作。如果它确实使textfield成为第一个响应程序,则在第二次调用时失败。。。。世界跆拳道联盟

我有一个UITextField,它是UIScrollView的子视图 我有一个简单的点击手势(或者可能是老的触摸),作为UITextField的一部分,使它成为第一个响应者。我想在UITextField中添加双击手势。为了使两个手势相互排斥,我需要重载(虽然这不是一个正确的词,因为我没有使用相同的名称)单点击手势。当我这样做时,只要它调用的函数不使UITextField成为第一响应程序,它就可以正常工作。如果它确实使textfield成为第一个响应程序,则在第二次调用时失败。。。。世界跆拳道联盟。所以stack,一点帮助会有很大的帮助

这就是我添加手势的地方

 UITapGestureRecognizer * singleTextTap = [[UITapGestureRecognizer alloc] 
             initWithTarget:self action:@selector(handleSingleTextTap:)];         
 singleTextTap.numberOfTapsRequired = 1;
 [aTextField addGestureRecognizer:singleTextTap];
这就是它的名字

//single tap text
- (void) handleSingleTextTap:(UITapGestureRecognizer *)gestureRecognizer{
    NSLog(@"handling single tap");
    NSLog(@"textField gestures %@", 
          [gestureRecognizer.view.gestureRecognizers descriptionWithLocale:nil]);
    [(UITextField *)gestureRecognizer.view becomeFirstResponder];
}

您可能会注意到NSLog将注册到文本字段的gestuers输出,这是为了检查我的singleTextTap手势的状态。第一次和第二次都是“结束”的,这段代码永远不会到达

你所做的看起来很奇怪,但不管怎样。我想你知道你在做什么

您可以尝试以下方法:

UITapGestureRecognizer *doubleTap = ...;
UITapGestureRecognizer *singleTap = ...;
[singleTap requireGestureRecognizerToFail:doubleTap];

这意味着单点击识别器只有在双点击识别器未启动时才会启动,从而有效地使它们相互排斥。

您看到的行为是由于每次您向
UITextField
发送
becomeFirstResponder
消息时,它都会设置自己的手势识别器。如果您登录[textField gestureRecognizers],您将看到它设置了很多。这些用于处理文本编辑功能,如长按光标移动等。通过添加这些,它将取消您已设置的。处理这个问题最简单的方法就是这样

- (void) singleTap:(UITapGestureRecognizer*)singleTap {
    if (![self.textField isFirstResponder]) {
        [self.textField becomeFirstResponder];
        self.label.text = @"Single Tap -> Make First Responder";
        [self.label setNeedsDisplay];
    }
}
- (void) doubleTap:(UITapGestureRecognizer*)doubleTap {
    if (![self.textField isFirstResponder]) {
        [self.textField becomeFirstResponder];
        self.label.text = @"Double Tap -> Make First Responder";
        [self.label setNeedsDisplay];
    }
}

- (void) setupTextGestureRecognizers {
    for (UIGestureRecognizer *rec in self.textField.gestureRecognizers) {
        [self.textField removeGestureRecognizer:rec];
    }
    UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)] autorelease];
    UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)] autorelease];
    [singleTap setNumberOfTapsRequired:1];
    [doubleTap setNumberOfTapsRequired:2];
    [singleTap setCancelsTouchesInView:YES];
    [doubleTap setCancelsTouchesInView:YES];
    [singleTap requireGestureRecognizerToFail:doubleTap];
    [self.textField addGestureRecognizer:singleTap];
    [self.textField addGestureRecognizer:doubleTap];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupTextGestureRecognizers];
    self.textField.delegate = self;
}


- (BOOL) textFieldShouldReturn:(UITextField *)tf {
    [tf resignFirstResponder];
    if (tf == self.textField) {
        [self setupTextGestureRecognizers];
    }
    return YES;
}

下面是一个演示此代码使用的示例。

此答案为我提供了解决自己问题所需的线索。我有一个点击识别器,用于点击文本字段子视图时被忽略的视图。通过暂时禁用文本字段中的所有
手势识别器
,我得到了我想要的行为,没有不良副作用。