Swift:手势识别器未注册

Posted

技术标签:

【中文标题】Swift:手势识别器未注册【英文标题】:Swift: Gesture recogniser isn't registering 【发布时间】:2015-02-02 17:08:12 【问题描述】:

我不知道为什么,但我的控制器的手势识别器似乎没有注册,我正在使用UITableViewController 并执行了以下步骤:

override func viewDidLoad() 
    super.viewDidLoad()
    tableView.delegate = self   // This should be done already as it is a subclass
                                // of UITableViewController, just put this to debug...

    // Gesture Recognisers - never seems to register (action never called)
    let swipeDown = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
    swipeDown.direction = UISwipeGestureRecognizerDirection.Down
    self.tableView.addGestureRecognizer(swipeDown)

viewDidLoad() 中为手势注册回调操作后,我声明了以下方法:

func respondToSwipeGesture(gesture: UIGestureRecognizer) 

    // Can we unwrap safely?
    if let swipeGesture = gesture as? UISwipeGestureRecognizer 

        switch swipeGesture.direction
        
        case UISwipeGestureRecognizerDirection.Down:
            break
        case UISwipeGestureRecognizerDirection.Up:
            break
        case UISwipeGestureRecognizerDirection.Left:
            break
        case UISwipeGestureRecognizerDirection.Right:
            break
        default:
            break
        
    

我在整个respondToSwipeGesture() func 中设置了断点,但似乎从未调用过该方法——这可能是什么原因造成的?我在单独的线程上运行了一些数据模型填充方法,但我认为这不会与正在注册的手势识别器冲突。

【问题讨论】:

在我看来,tableView 在您的滑动手势之前拦截并消耗了触摸事件。可能您可能更喜欢将手势识别器添加到您的 tableViewCells。 完全有道理,我试试看 无论如何,从用户的角度考虑,在垂直滚动容器上向下滑动似乎是不切实际的。使用单元格内的手势,您可能应该无论如何都应该实现手势委托,以让正常的垂直滚动钢起作用。 我真正想要的是检测用户是否在向上滚动,以确定新卡片是否应该执行他们的动画(类似于 Google+ 应用的工作方式) 考虑你的控制器可以是你的tableView的滚动视图代理。只需将 tableView 的委托设置为您的控制器。然后您将收到tableView 的滚动视图中发生的各种滚动视图事件。 【参考方案1】:

这里是一个简单的例子,如果你的 tableView 向上或向下滚动时打印:

var offsetY: CGFloat = 0 
        didSet 
            if oldValue > offsetY 
                println("Going down!")
             else 
                println("Going up!")
            
        
    

    //MARK: Scroll View Delegate

    func scrollViewDidScroll(scrollView: UIScrollView) 

        // Verify that the sander is your tableView
        // Not needed if the only scrollView is the tableView
        if scrollView === self.tableView 
            offsetY = scrollView.contentOffset.y
        
    


    //MARK: View Lifecycle

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        // You can do it in your storyboard
        tableView.delegate = self

    

一旦您的 ViewController 是 tableView 委托,它还将接收来自 tableView 的滚动视图的UIScrollViewDelegate 消息。 在UIScrollViewDelegate 协议中,您可能会找到您要查找的内容。上面的示例可用于将另一个视图 sticky 保持在 tableView 内的固定位置。

【讨论】:

以上是关于Swift:手势识别器未注册的主要内容,如果未能解决你的问题,请参考以下文章

将 initWithCoder: implementation 转换为 Swift 时未触发手势识别器选择器

iOS Swift - 使点击手势识别器在视图下工作

SWIFT4:如何让两个点击手势识别器一起工作

为啥滑动手势识别器在 swift 中会出错?

Swift 3 多手势识别器 SWRevealController

Swift - 将手势识别器添加到表格单元格中的对象