web-dev-qa-db-fra.com

Méthode de substitution avec le sélecteur 'touchesBegan: withEvent:' est de type incompatible '(NSSet, UIEvent) -> ()'

Xcode 6.3. Dans une classe implémentant le protocole UITextFieldDelegate, je voudrais redéfinir la méthode touchesBegan () pour éventuellement masquer le clavier. Si j'évite une erreur de compilation dans la spécification de la fonction, il y a une erreur plus complète lorsque vous essayez de lire la "touche" de l'ensemble ou du NSSet, ou le super.touchesBegan (touches, avec événement: événement) génère une erreur. Une de ces combinaisons compilées dans Xcode 6.2! (Alors, où est la documentation pour Swift "Set" et comment obtenir un élément d'un?)

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

Essayer:

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

Erreur de compilation: Méthode de substitution avec le sélecteur 'touchesBegan: withEvent:' est de type incompatible '(NSSet, UIEvent) -> ()'

super.touchesBegan(touches , withEvent:event)

se plaint aussi

'NSSet' n'est pas implicitement convertible en 'Set'; vouliez-vous utiliser 'en tant que' pour convertir explicitement?

Essayer:

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

Erreur du compilateur: Le type 'AnyObject' n'est pas conforme au protocole 'Hashable'

Essayer:

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

Erreur du compilateur à 

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

'Set' n'a pas de membre nommé 'anyObject' MAIS la fonction spec et l'appel à super () sont OK!

Essayer:

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

Erreur du compilateur: Impossible de spécialiser le type non générique 'NSSet'

72
SoCor

Avec xCode 7 et Swift 2.0, utilisez le code suivant:

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)
}
10
Himanshu Mahajan

Utiliser Swift 3 et 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>
}
9
Chetan Prajapati

La version actuelle pour la dernière mise à jour de xCode 7.2 Swift 2.1 du 19 décembre 2015.

La prochaine fois que vous rencontrerez une erreur comme celle-ci, supprimez la fonction et recommencez à la saisir "touchesBe ..." et xCode la complétera automatiquement à la plus récente, au lieu d'essayer de corriger l'ancienne.

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
Jose Ramirez

Il est maintenant dans la référence API Apple ici et vous pouvez utiliser ce code pour remplacer dans xCode version 6.3 et Swift 1.2:

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

Petit ajout. Pour que Swift puisse compiler sans erreur, vous devez ajouter

importer UIKit.UIGestureRecognizerSubclass

4
beshio

Ce qui a fonctionné pour moi a été:

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

        super.touchesBegan(touches , withEvent:event!)
    }
4
jfredsilva

Utiliser Swift 4 et Xcode 9

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

}
0
ammar shahid