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

时间:2016-01-29 04:44:09

标签: ios swift uitapgesturerecognizer

我试图在UITapGestureRecognizer的自定义子类中覆盖touchesBegan。代码如下。我从这里得到了它:How to accelerate the identification of a single tap over a double tap?。这是接受的答案,但我收到一个错误:方法不会覆盖其超类中的任何方法。我已经检查过,这确实似乎是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
            }
        }
    }


}

4 个答案:

答案 0 :(得分:5)

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

如果您使用的是1.2版之前的Swift版本的Xcode版本,则需要更改方法签名,如下所示:

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

或者,升级到Xcode 7。

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

仅在Xcode 6.3之后才可用。

答案 1 :(得分:0)

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

另一方面,如果您没有使用像swift 2.0+这样的swift的升级版本,请升级您的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)
}

答案 2 :(得分:0)

我确实在Swift 2.0中使用了Xcode 7.2。删除覆盖键盘不是解决方案。相反,我发现解决方案是添加导入UIKit.UIGestureRecognizerSubclass。这也让我可以写出状态属性,而不是只读它。

答案 3 :(得分:0)

对于Swift 4.2和XCode 10.2

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

    }