swift - example - [__NSCFTimer copyWithZone:]: selector no reconocido enviado a la instancia
timer.scheduledtimer swift 4 (1)
La función de devolución de llamada del temporizador debe ser una función sin argumentos o una función que toma un NSTimer
como un único argumento.
En tu caso, debería ser
func doDelayedSearch(timer: NSTimer) {
let searchText = timer.userInfo as String
// ...
}
Respuesta anterior: (Lo siguiente es correcto, pero no se aplica aquí)
El objetivo del temporizador ( self
en su caso) debe ser compatible con Objective-C, es decir, derivado de NSObject
o marcado con @objc
.
Consulte también Exposición de interfaces Swift en Objective-C en la documentación "Uso de Swift con Cocoa y Objective-C" (énfasis mío):
El atributo
@objc
hace que su API de Swift esté disponible en Objective-C y el tiempo de ejecución de Objective-C. En otras palabras, puede usar el atributo@objc
antes de cualquier método Swift, propiedad, subíndice, inicializador o clase que desee usar del código Objective-C. Si su clase hereda de una clase Objective-C, el compilador inserta el atributo por usted.
...
Este atributo también es útil cuando se trabaja con clases Objective-C que usan selectores para implementar el patrón de diseño de acción objetivo, por ejemplo,NSTimer
oUIButton
.
var searchDelayer:NSTimer?
func searchBar(searchBar: UISearchBar!, textDidChange searchText: String!) {
searchDelayer?.invalidate()
searchDelayer = nil
searchDelayer = NSTimer.scheduledTimerWithTimeInterval(1.5, target: self, selector: Selector("doDelayedSearch:"), userInfo: searchText, repeats: false)
}
func doDelayedSearch(text:String){
...
}
Por qué este código se bloquea con un mensaje de error:
[__NSCFTimer copyWithZone:]: unrecognized selector sent to instance
Actualizado:
Terminating app due to uncaught exception ''NSInvalidArgumentException'', reason: ''-[__NSCFTimer copyWithZone:]: unrecognized selector sent to instance 0x7f9c622ae7e0''
*** First throw call stack:
(
0 CoreFoundation 0x000000010c05b3e5 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010ba42967 objc_exception_throw + 45
2 CoreFoundation 0x000000010c0624fd -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x000000010bfba7ec ___forwarding___ + 988
4 CoreFoundation 0x000000010bfba388 _CF_forwarding_prep_0 + 120
5 CoreFoundation 0x000000010bf32935 CFStringCreateCopy + 229
6 libswiftFoundation.dylib 0x000000010dc41314 _TF10Foundation24_convertNSStringToStringFCSo8NSStringSS + 116
7 MapCode 0x000000010a1a567e _TToFC7MapCode17MapViewController15doDelayedSearchfS0_FSST_ + 62
8 Foundation 0x000000010b5fce94 __NSFireTimer + 83
9 CoreFoundation 0x000000010bfc34d4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
10 CoreFoundation 0x000000010bfc3095 __CFRunLoopDoTimer + 1045
11 CoreFoundation 0x000000010bf863cd __CFRunLoopRun + 1901
12 CoreFoundation 0x000000010bf859f6 CFRunLoopRunSpecific + 470
13 GraphicsServices 0x000000010ecfd9f0 GSEventRunModal + 161
14 UIKit 0x000000010c96b990 UIApplicationMain + 1282
15 MapCode 0x000000010a1b3fee top_level_code + 78
16 MapCode 0x000000010a1b402a main + 42
17 libdyld.dylib 0x000000010f9d7145 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException