¿Cómo usar el Selector Swift? Selector da como resultado constantemente `Tipo no tiene miembro`

Estoy luchando con la siguiente pieza de código:

backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: gvc, selector: #selector(GameViewController.addNext), userInfo: nil, repeats: true) 

No puedo hacer que el #selector funcione. Este código resulta para:

 Type 'GameViewController' has no member 'addNext' 

Aunque el miembro está allí … Aquí está el código completo:

 class GameViewController: GAITrackedViewController, AVAudioPlayerDelegate { var sceneCanvas: SKSpriteNode? override func viewDidLoad() { skView.presentScene(WelcomeScene(size: view.bounds.size, gvc: self)) } func createBackground(boundsSize: CGRect, gvc: GameViewController) -> SKSpriteNode { addUILabels(gvc) return sceneCanvas! } func addUILabels(gvc: GameViewController) { backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: gvc, selector: #selector(GameViewController.addNext), userInfo: nil, repeats: true) } public func addNext() { let backgroundLabel = SKSpriteNode(imageNamed: "label1.png") sceneCanvas!.addChild(backgroundLabel!) backgroundLabel?.runAction(SKAction.moveByX(-screenSize.width , y: 0, duration: 12)) } } class WelcomeScene: SKScene { init(size: CGSize, gvc: GameViewController){ super.init () let bounds = CGRect(origin: CGPoint(x: 0,y: 0), size: size) sceneCanvas = createBackground(bounds, gvc: gvc) self.addChild(sceneCanvas!) } } 

 backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("addNext"), userInfo: nil, repeats: true) 

Probablemente su código esté en diferentes modules. Si es así, debería hacer que su func addNext() pública:

 public func addNext() { ... } 

¿Has probado esto?

 backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: #selector(GameViewController.addNext), userInfo: nil, repeats: true) 

o

 backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: gvc, selector: #selector(gvc.addNext), userInfo: nil, repeats: true) 

Resulta que dos cosas fueron el problema. 1) Había definido el método fuera de la class, 2) Sin embargo, también se necesitaba la siguiente syntax para que funcione:

selector: #selector(addNext as () -> ())

Me encontraba con este problema con UILongPressGestureRecognizer y Swift 3.

Tenía mi método en una extensión para una pulsación prolongada en una celda de vista de tabla:

 // Long press table view extension extension MyViewController: UIGestureRecognizerDelegate { public func handleLongPress(longPressGesture: UILongPressGestureRecognizer) { let p = longPressGesture.location(in: self.tableView) let indexPath = self.tableView.indexPathForRow(at: p) if indexPath == nil { print("Long press on table view, not row.") } else if (longPressGesture.state == UIGestureRecognizerState.began) { print("Long press on row, at \(indexPath!.row)") } } } 

Entonces, en mi vista, viewDidLoad() :

  // Configure long press on tableviewcell let longPressGesture:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(MyViewController.handleLongPress)) longPressGesture.minimumPressDuration = 1.0 // 1 second press longPressGesture.delegate = self self.tableView.addGestureRecognizer(longPressGesture) 

Para mí, el problema se solucionó al usar esta syntax para el selector:

 action: #selector(MyViewController.handleLongPress) 

Probé las siguientes alternativas sin suerte. Estos no funcionan :

  •  action: #selector(self.handleLongPress) 
  •  action: #selector(MyViewController.handleLongPress(_:)) 
  •  action: #selector(self.handleLongPress(_:)) 
  •  action: #selector("handleLongPress(_:)") 

Además, aunque no parece pasar ningún argumento a MyViewController.handleLongPress , la fila seleccionada imprime a la console muy bien en la selección de la prensa larga:

Long press on row, at 5