scheduledtimer scheduled example create swift nstimer

scheduled - Xcode 7.3/Swift 2: advertencia de "Ningún método declarado con selector de Objective-C"



swift timer scheduledtimer example (4)

He estado usando selectores por un tiempo, e incluso después de migrar a Swift, pude usarlos sin problemas. Así era como lo estaba usando en Swift 2 sin problemas hasta que actualicé Xcode a la versión 7.3:

Como puedo ver el uso yo uso selectores con NSTimer.

Esta es la acción que se llama:

func Start () { }

Como puede ver, Xcode 7.3 ahora muestra una advertencia "No se ha declarado ningún método con el selector Objective-C". Al hacer clic en la advertencia, Xcode ofrece una solución rápida al código agregando "Selector", pero luego sigo recibiendo la misma advertencia:


Algunos hallazgos propios para apoyar lo que dijo Vincent (demasiado largo para ser un comentario directo)

No está necesariamente en un controlador de vista diferente, sino en un archivo diferente donde el siguiente formato no funcionará:

button.addTarget(parentViewController, action: Selector("buttonHandler:"), forControlEvents: .TouchUpInside)

Por ejemplo, si tiene una extensión en un archivo separado, aunque para el mismo controlador de vista, este Selector("buttonHandler:") formato Selector("buttonHandler:") no funcionará.

Además, cuando el selector está en el mismo archivo y VC, la solución rápida de Xcode le pide que haga que el selector incluya el constructor, por lo que se vería así:

#selector(MainViewController.buttonHandler(_:))

Sin embargo, este formato solo funciona cuando el selector está en el mismo archivo VC +, si está en un archivo separado, pero en el mismo VC, entonces el método recomendado no funcionará, y debe usar el método sin el constructor

#selector(MainViewController.buttonHandler)


Ambas declaraciones siguientes funcionan perfectamente. El superior se utiliza principalmente. Sin embargo, cuando el método del selector está en un ViewController diferente, puede aparecer la advertencia del compilador "No se puede declarar ningún método con el selector de Objective-C ''ButtonHandler''".

La segunda declaración enumerada no da esta advertencia.

button.addTarget(parentViewController, action: Selector("buttonHandler:"), forControlEvents: .TouchUpInside) button.addTarget(parentViewController, action: #selector(MainViewController.buttonHandler), forControlEvents: .TouchUpInside)

En el controlador de vista de destino (MainViewController) puede definir el módulo:

func buttonHandler(sender:UIButton!) { print ("Pressed") }


Desde Swift 2.2 / Xcode 7.3 hay una nueva forma de usar un selector: el Selector("funcName") se cambió a #selector(ClassName.funcName)

Eche un vistazo a https://github.com/apple/swift-evolution/blob/master/proposals/0022-objc-selectors.md ,

tl; dr;

Reemplace Selector("Start") con #selector(YOUR_CLASS.Start)

donde YOUR_CLASS = clase de destino en el contexto dado.

Si no desea hacerlo manualmente, Xcode proporciona una solución fácil por sí misma de manera predeterminada, cuando se presenta la siguiente situación, toque los triángulos amarillos (a veces es necesario tocar / hacer clic varias veces),

te dará sugerencia:

Y si selecciona esa sugerencia, se actualizará automáticamente el selector:


En Swift 4 tuve que agregar @objc antes de la función para deshacerme de las advertencias.

Así es como llamo a la función con NSTimer:

Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.intro), userInfo: nil, repeats: false)

Así es como se declara la función:

@objc func intro () { // do your stuff here }

También actualicé la configuración según lo solicitado por Xcode:

No más advertencias, todo parece estar funcionando bien.