UITableView 作为 UIGestureRecognizerDelegate

UITableView as UIGestureRecognizerDelegate

我想通过添加自定义 UIPanGestureRecognizer 来扩展 UITableView:

extension UITableView {

   func addCustomPanGestureRecognizer() {
        let panGestureRecognizer = UIPanGestureRecognizer()
        panGestureRecognizer.delegate = self
        addGestureRecognizer(panGestureRecognizer)

        // some additional setup
        // ...
    }

}

由于自定义手势识别器会干扰滚动,我尝试使用可选要求实现 UIGestureRecognizerDelegate

extension UITableView: UIGestureRecognizerDelegate {

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return otherGestureRecognizer == self.panGestureRecognizer
    }

}

...但它根本没有被调用,尽管委托给 tableView(如上所示)。

此外,Xcode 显示警告:

Instance method 'gestureRecognizer(:shouldRecognizeSimultaneouslyWith:)' nearly matches optional requirement 'gestureRecognizer(:shouldRecognizeSimultaneouslyWith:)' of protocol 'UIGestureRecognizerDelegate'

为了消除警告,我尝试在方法定义之前添加 @objc 注释,但没有成功。

事实证明,Xcode 需要一些额外的帮助来找到合适的 Objective-C 方法定义。为此,我必须在 @objc 注释之后提供方法签名:

extension UITableView: UIGestureRecognizerDelegate {

    @objc(gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:)
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return otherGestureRecognizer == self.panGestureRecognizer
    }

}

仍然显示警告,但正在正确调用方法。