Método de reemplazo con selector ‘touchesBegan:withEvent:’ ha incompatible tipo ‘(NSSet, UIEvent) -> ()’

Xcode 6.3. Dentro de una clase que implementa UITextFieldDelegate protocolo, me gustaría reemplazar touchesBegan() método posiblemente para ocultar el teclado. Si puedo evitar que un error del compilador en la función de la especificación, entonces no es un compilador de error al intentar leer el «toque» del Conjunto o NSSet, o de lo contrario el super.touchesBegan(toques , withEvent:event) lanza un error. Una de estas combinaciones compilado en Xcode 6.2! (Entonces, ¿dónde está la documentación a Swift «Set» y cómo obtener un elemento de una?)

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    //Hiding the Keyboard when the User Taps the Background
        if let touch =  touches.anyObject() as? UITouch {
            if nameTF.isFirstResponder() && touch.view != nameTF {
                nameTF.resignFirstResponder();
            }
        }
        super.touchesBegan(touches , withEvent:event)
    }

Tratar:

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

De error del compilador:
Método de reemplazo con selector ‘touchesBegan:withEvent:’ ha incompatible tipo ‘(NSSet, UIEvent) -> ()’
y

super.touchesBegan(touches , withEvent:event)

también se queja de

‘NSSet’ no es convertir implícitamente ‘Set’; quiso decir el uso de ‘como’ para convertir explícitamente?

Tratar:

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

De error del compilador:
Tipo de ‘AnyObject’ no se ajusta al protocolo de Hashable’

Tratar:

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

De error del compilador en

if let touch = touches.anyObject() as? UITouch 

‘Set’ no tiene un miembro llamado ‘anyObject’, PERO la función de la especificación y de la llamada a super() son OK!

Tratar:

override func touchesBegan(touches: NSSet<AnyObject>, withEvent event: UIEvent) -> () or
override func touchesBegan(touches: NSSet<NSObject>, withEvent event: UIEvent) 

De error del compilador:
Puede especializarse no genérica de tipo ‘NSSet’

InformationsquelleAutor SoCor | 2015-02-27

9 Kommentare

  1. 161

    Swift 1.2 (Xcode 6.3) introdujo un nativo Set tipo de puentes
    con NSSet. Esto se menciona en el Swift blog y en el
    Xcode 6.3 notas de la versión, pero al parecer no se ha agregado a la documentación oficial (actualización: Como Ahmad Ghadiri señaló, se es documentado ahora).

    La UIResponder método se ha declarado como

    func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)

    y se puede reemplazar como este:

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        if let touch = touches.first as? UITouch {
            //...
        }
        super.touchesBegan(touches , withEvent:event)
    }

    Actualización para Swift 2 (Xcode 7): (Comparar Reemplazar func error en Swift 2)

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        if let touch = touches.first {
            //...
        }
        super.touchesBegan(touches, withEvent:event)
    }

    Actualización para Swift 3:

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first {
            //...
        }
        super.touchesBegan(touches, with: event)
    }
    • Gracias Martin R, Todo lo que tenía que hacer era cambiar mi NSSet para Establecer<NSObject> y mi código está en funcionamiento.
    • Hola @Martin por Qué super.touchesBegan(touches , withEvent:event) es necesario? Sigo sin entender Swift muy bien.
    • Me siento como debe ser este: super.touchesBegan(toques, withEvent:evento!) para xCode 7.2
    • ¿Por qué piensas así? El último método todavía se compila con Xcode 7.2.
    • ella se quejaba de mí…valor de tipo opcional, no sin envolver
    • porque es la superclase de que eventualmente se comunica/de transferencia de la touch, event y hace que la interfaz de cambio. Las cosas no se manejan apropiadamente….

  2. 10

    Con xCode 7 y swift 2.0, utilice el siguiente código:

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    
        if let touch =  touches.first{
            print("\(touch)")
        }
        super.touchesBegan(touches, withEvent: event)
    }
    
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    
        if let touch = touches.first{
            print("\(touch)")
        }
        super.touchesEnded(touches, withEvent: event)
    }
    
    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    
        if let touch = touches.first{
            print("\(touch)")
        }
        super.touchesMoved(touches, withEvent: event)
    }
    • I no se puede construir el proyecto. Recibiendo el error Método no reemplaza cualquier método de su superclase para la touchesBegan función. Traté de subclase de UIGestureRecognizer y UTapGestureRecognizer. Xcode 7.1
    • el uso de este stackoverflow.com/questions/30892254/… para ver lo que sucede en tu código
  3. 10

    Utilizando Swift 3 y Xcode 8

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    
    }
    
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    
    }
    
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    
    }
    
    override func touchesCancelled(_ touches: Set<UITouch>?, with event: UIEvent?) {
    //Don't forget to add "?" after Set<UITouch>
    }
  4. 6

    Que ahora está en la Manzana de referencia de la API aquí y para reemplazar en la versión de xCode 6.3 y swift 1.2 usted puede utilizar este código:

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        if let touch =  touches.first as? UITouch {
             //...
        }
        //...
    }
    • Interesante que la documentación en línea es correcta, pero la versión incluida en el Xcode sistema de ayuda está fuera de fecha. Creo que es necesario para conseguir en el hábito de la búsqueda de este material en línea.
  5. 6

    El actual, ahora para la nueva actualización de xCode 7.2 Swift 2.1 en Dec 19, 2015.

    La próxima vez que reciba un error como este, de nuevo, quitar la función y empezar a escribir de nuevo «touchesBe…» y xCode debe completar automáticamente a la más reciente para que en lugar de intentar arreglar el viejo.

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    
        for touch: AnyObject! in touches {
            let touchLocation = touch.locationInNode(self)
    
            //Use touchLocation for example: button.containsPoint(touchLocation) meaning the user has pressed the button.
        }
    }
  6. 4

    Lo que funcionó para mí fue:

        override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
            if let touch = touches.first as? UITouch {
                //...
            }
    
            super.touchesBegan(touches , withEvent:event!)
        }
    • Si usted está en Xcode 6.3 y Swift 1.2 el código no funcionará. Este post si referencia Xcode 6.3 y Swift 1.2.
    • Tienes razón, he actualizado el Xcode de hoy y de inmediato dio error.
  7. 4

    Pequeña adición. Para swift para compilar w/o de error, es necesario agregar

    de importación UIKit.UIGestureRecognizerSubclass

  8. 0
      override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    
            if let touch = touches.first as? UITouch {
    
                if touch.view == self.view{
                    self.dismiss(animated: true, completion: nil)
                }
            }
        }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea