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'
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)
}
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>
}
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.
}
}
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 {
// ...
}
// ...
}
Petit ajout. Pour que Swift puisse compiler sans erreur, vous devez ajouter
importer UIKit.UIGestureRecognizerSubclass
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!)
}
Utiliser Swift 4 et Xcode 9
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
}