覆盖 touchesBegan:错误 - 方法不会覆盖超类中的任何方法

Overriding touchesBegan: Error - method does not override any method from superclass

我正在尝试覆盖 UITapGestureRecognizer 的自定义子类中的 touchesBegan。代码如下。我从这里得到它:。这是公认的答案,但我收到一个错误:方法不会覆盖其超类中的任何方法。我已经检查过了,这似乎确实是 touchesBegan 的签名。帮忙?

import UIKit

class UIShortTapGestureRecognizer: UITapGestureRecognizer {
    let tapMaxDelay: Double = 0.3

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        super.touchesBegan(touches, withEvent: event)
        delay(tapMaxDelay) {
        // Enough time has passed and the gesture was not recognized -> It has failed.
            if  self.state != UIGestureRecognizerState.Ended {
                self.state = UIGestureRecognizerState.Failed
            }
        }
    }


}

问题源于您没有使用 Xcode 7;您的语法在 Swift 1.2+ 中,但不受您使用的 Xcode 版本的支持。

如果您使用 Xcode 版本和 Swift 1.2 之前的版本,您需要按如下方式更改方法签名:

override func touchesBegan(touches: NSSet!, withEvent event: UIEvent?)

或者,升级到Xcode 7.

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)

仅从 Xcode 6.3 开始可用。

请尝试删除 override 关键字。当您的超类也实现该方法时,可以进行覆盖。在您的情况下,您提供了一个版本来替换或修改超类实现的行为。我认为这不是在这里采取行动。

另一方面,如果您没有使用 swift 的升级版本,例如 swift 2.0+,那么请升级您的 Xcode,这将升级您的 Swift 版本也是。

在我的例子中,此方法如下所示。我正在使用 Xcode 7.2 和 Swift 2.1.1。举个例子 -

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    testTouchMan(touches)
    let touch: UITouch! = touches.first as UITouch!
    let location = touch.locationInView(self.groundFloorView)
}

我确实在使用 Xcode 7.2 和 Swift 2.0。移除覆盖键盘并不是解决方案。相反,我发现解决方案是添加 import UIKit.UIGestureRecognizerSubclass。这也让我可以覆盖状态 属性,而不是只读状态。

对于 Swift 4.2 和 XCode 10.2

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)

    }