Estoy tratando de anular touchesBegan en una subclase personalizada de UITapGestureRecognizer. El código está debajo. Lo obtuve desde aquí: ¿Cómo acelerar la identificación de un solo toque con un doble toque?. Fue la respuesta aceptada, pero recibo un error: el método no anula ningún método de su superclase. Lo he comprobado y, de hecho, esta parece ser la firma de los toquesBegan. ¿Ayuda?

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
            }
        }
    }


}
2
Justin Leonard 29 ene. 2016 a las 07:44

4 respuestas

La mejor respuesta

De hecho, estaba usando Xcode 7.2 con Swift 2.0. Y quitar el teclado de anulación no fue la solución. En cambio, descubrí que la solución era agregar import UIKit.UIGestureRecognizerSubclass. Eso también me permitió escribir sobre la propiedad estatal, en lugar de ser de solo lectura.

0
Justin Leonard 29 ene. 2016 a las 12:11

Intente eliminar la palabra clave anulada. Una anulación es posible cuando su superclase también implementa ese método. En su caso, está proporcionando una versión que reemplaza o modifica el comportamiento de la implementación de la superclase. Lo cual no es hacer la acción aquí, creo.

Por otro lado, si no está utilizando la versión mejorada de swift como swift 2.0+, actualice su Xcode, que también actualizará su versión de Swift.

En mi caso, este método se parece a lo siguiente. Estoy usando Xcode 7.2 con Swift 2.1.1. Sin embargo, solo como ejemplo:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    testTouchMan(touches)
    let touch: UITouch! = touches.first as UITouch!
    let location = touch.locationInView(self.groundFloorView)
}
0
onCompletion 29 ene. 2016 a las 05:31

Para Swift 4.2 y XCode 10.2

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

    }
1
Mujahid Latif 31 may. 2019 a las 08:10

El problema se debe al hecho de que no está utilizando Xcode 7; su sintaxis está en Swift 1.2+ pero no es compatible con la versión de Xcode que está utilizando.

Si está utilizando la versión Xcode con la versión Swift anterior a la 1.2, deberá cambiar la firma del método de la siguiente manera:

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

O actualice a Xcode 7.

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

Estuvo disponible solo desde Xcode 6.3.

5
Unheilig 29 ene. 2016 a las 05:14