UITapGestureRecognizer中断了UITableView didSelectRow

我已经编写了自己的函数来在键盘出现时向上滚动文本字段。为了通过点击文本字段来关闭键盘,我创建了一个UITapGestureRecognizer在点击时关注文本字段上的第一响应者的工作。

现在,我还为UITableView文本字段创建了一个自动完成功能,在文本字段正下方创建一个自动填充,并在用户输入文本时用项目填充它。

但是,当选择自动完成表中的一个条目时,didSelectRowAtIndexPath不会被调用。相反,似乎轻敲手势识别器正在被调用并且刚刚辞职第一响应者。

我猜是有一些方法可以告诉水龙头手势识别器继续将点击消息传递给UITableView,但我无法弄清楚它是什么。任何帮助将非常感激。


繁星coding
浏览 744回答 3
3回答

子衿沉夜

好吧,经过一些搜索手势识别器文档后终于找到了它。解决方案是实现UIGestureRecognizerDelegate并添加以下内容:////////////////////////////////////////////////////////////// UIGestureRecognizerDelegate methods#pragma mark UIGestureRecognizerDelegate methods- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{    if ([touch.view isDescendantOfView:autocompleteTableView]) {        // Don't let selections of auto-complete entries fire the         // gesture recognizer        return NO;    }    return YES;}这照顾了它。希望这对其他人也有帮助。

烙印99

解决此问题的最简单方法是:UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc]     initWithTarget:self action:@selector(tap:)];[tapRec setCancelsTouchesInView:NO];这样可以UIGestureRecognizer识别敲击并将触摸传递给下一个响应者。这种方法的一个意想不到的后果是,如果你有一个UITableViewCell推动另一个视图控制器的屏幕。如果用户点击该行以关闭键盘,则将识别键盘和推送。我怀疑这是你想要的,但这种方法适用于许多情况。另外,扩展罗伯特的答案,如果你有一个指向相关的tableview的指针,那么你可以直接比较它的类而不必转换为字符串,并希望Apple不会改变命名法:- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer      shouldReceiveTouch:(UITouch *)touch{    if([touch.view class] == tableview.class){        return //YES/NO    }    return //YES/NO}请记住,您还必须声明UIGestureRecognizer具有此代码的委托。

皈依舞

将cancelsTouchesInView识别器设置为false。否则,它会“消耗”触摸本身,并且不会将其传递给表格视图。这就是选择事件永远不会发生的原因。例如在 swiftlet tapOnScreen: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "CheckTheTime")tapOnScreen.cancelsTouchesInView = falseview.addGestureRecognizer(tapOnScreen)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS