为了账号安全,请及时绑定邮箱和手机立即绑定

UITapGestureRecognizer中断了UITableView didSelectRow

UITapGestureRecognizer中断了UITableView didSelectRow

iOS
繁星coding 2019-09-19 15:10:24
我已经编写了自己的函数来在键盘出现时向上滚动文本字段。为了通过点击文本字段来关闭键盘,我创建了一个UITapGestureRecognizer在点击时关注文本字段上的第一响应者的工作。现在,我还为UITableView文本字段创建了一个自动完成功能,在文本字段正下方创建一个自动填充,并在用户输入文本时用项目填充它。但是,当选择自动完成表中的一个条目时,didSelectRowAtIndexPath不会被调用。相反,似乎轻敲手势识别器正在被调用并且刚刚辞职第一响应者。我猜是有一些方法可以告诉水龙头手势识别器继续将点击消息传递给UITableView,但我无法弄清楚它是什么。任何帮助将非常感激。
查看完整描述

3 回答

?
子衿沉夜

TA贡献1828条经验 获得超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;

}

这照顾了它。希望这对其他人也有帮助。


查看完整回答
反对 回复 2019-09-19
?
烙印99

TA贡献1829条经验 获得超13个赞

解决此问题的最简单方法是:


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具有此代码的委托。


查看完整回答
反对 回复 2019-09-19
?
皈依舞

TA贡献1851条经验 获得超3个赞

将cancelsTouchesInView识别器设置为false。否则,它会“消耗”触摸本身,并且不会将其传递给表格视图。这就是选择事件永远不会发生的原因。


例如在 swift


let tapOnScreen: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "CheckTheTime")

tapOnScreen.cancelsTouchesInView = false

view.addGestureRecognizer(tapOnScreen)


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 743 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信