ios - stored - swift 4 constructor
Método de anulación con el selector ''touchesBegan: withEvent:'' tiene un tipo incompatible ''(NSSet, UIEvent)->()'' (8)
Xcode 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 de compilación que intenta leer el "toque" del Set o NSSet, o bien el super.touchesBegan (touch, withEvent: event) arroja un error. ¡Una de estas combinaciones compilada en Xcode 6.2! (Entonces, ¿dónde está la documentación para Swift "Set" 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)
}
Tratar:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) or
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent)
Error del compilador: 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''; ¿Querías usar ''as'' para convertir explícitamente?
Tratar:
override func touchesBegan(touches: Set<AnyObject>, withEvent event: UIEvent)
Error del compilador: el tipo ''AnyObject'' no se ajusta al protocolo ''Hashable''
Tratar:
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 la función y la llamada a super () están bien.
Tratar:
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''
Ahora está en la referencia de la API de Apple here 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 {
// ...
}
// ...
}
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)
}
La actual en este momento para la actualización más reciente a partir de xCode 7.2 Swift 2.1 el 19 de diciembre de 2015.
La próxima vez que reciba un error como este nuevamente, elimine la función y comience a escribirla nuevamente "touchesBe ..." y xCode debería completarla automáticamente en la más nueva para usted en lugar de intentar reparar la anterior.
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.
}
}
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!)
}
Pequeña adición. Para una compilación rápida sin error, debe agregar
importar UIKit.UIGestureRecognizerSubclass
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>
}
Usando Swift 4 y Xcode 9
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
}
Swift 1.2 (Xcode 6.3)
introdujo un tipo de
Set
nativo que se
NSSet
con
NSSet
.
Esto se menciona en el
blog Swift
y en las
notas de lanzamiento 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 método
UIResponder
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): (Comparar error de función de anulació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)
}