scheduledtimer example create swift nstimer ios8

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 o UIButton .

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