El método de anulación con el selector 'touchesBegan:withEvent:' tiene un tipo incompatible '(NSSet, UIEvent) -> ()'
Xcódigo 6.3. Dentro de una clase que implementa el protocolo UITextFieldDelegate, me gustaría anular el método touchesBegan() para posiblemente ocultar el teclado. Si evito un error del compilador en la especificación de la función, entonces hay un error del compilador al intentar leer el "toque" del Set o NSSet, o super.touchesBegan(touches, withEvent:event) arroja un error. ¡Una de estas combinaciones compiladas en Xcode 6.2! (Entonces, ¿dónde está la documentación para "Establecer" Swift y cómo obtener un elemento de uno?)
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)
}
Intentar:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) or
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent)
Error del compilador: el método de anulación con el selector 'touchesBegan:withEvent:' tiene un tipo incompatible '(NSSet, UIEvent) -> ()' y
super.touchesBegan(touches , withEvent:event)
también se queja
'NSSet' no es implícitamente convertible a 'Set'; ¿Quisiste usar 'como' para convertir explícitamente?
Intentar:
override func touchesBegan(touches: Set<AnyObject>, withEvent event: UIEvent)
Error del compilador: el tipo 'AnyObject' no se ajusta al protocolo 'Hashable'
Intentar:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
Error del compilador en
if let touch = touches.anyObject() as? UITouch
'Set' no tiene un miembro llamado 'anyObject' PERO la especificación de función y la llamada a super() están bien.
Intentar:
override func touchesBegan(touches: NSSet<AnyObject>, withEvent event: UIEvent) -> () or
override func touchesBegan(touches: NSSet<NSObject>, withEvent event: UIEvent)
Error del compilador: no se puede especializar el tipo no genérico 'NSSet'
Swift 1.2 (Xcode 6.3) introdujo un tipo nativo Set
que sirve de puente con NSSet
. Esto se menciona en el blog de Swift y en las
notas de la versión de Xcode 6.3 , pero aparentemente aún no se ha agregado a la documentación oficial (actualización: como señaló Ahmad Ghadiri , ahora está documentado).
El UIResponder
método ahora se declara como
func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
y puedes anularlo así:
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): ( Error de función de anulación de comparación 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)
}
Con xCode 7 y swift 2.0, use 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)
}
Usando 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>
}
Ahora está en la referencia de la API de Apple aquí y para anular en xCode versión 6.3 y swift 1.2 puede usar este código:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
if let touch = touches.first as? UITouch {
// ...
}
// ...
}