如何使用 Swift 选择器?选择器不断导致“类型没有成员”

How to use Swift Selector? Selector constantly results to `Type has no member`

我正在努力处理以下代码:

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

我似乎无法让#selector 工作。此代码结果为:

Type 'GameViewController' has no member 'addNext'

即使会员就在那里......这是完整的代码:

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)

可能您的代码在不同的模块中。如果是这样,您应该 func addNext() public:

public func addNext() {
    ...
}

你试过了吗

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

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

原来有两个问题。 1) 我已经在 class 之外定义了方法,2) 但是它的工作还需要以下语法:

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

我 运行 与 UILongPressGestureRecognizer 和 Swift 3 一起陷入这个问题。

我在 table 视图单元格的长按扩展中使用了我的方法:

// 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)")
         }   
     }
 }

然后,在我的 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)

对我来说,通过对选择器使用以下语法解决了这个问题:

action: #selector(MyViewController.handleLongPress)

我尝试了以下替代方案,但没有任何运气。 这些都不行:

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

此外,即使我似乎没有将任何参数传递给 MyViewController.handleLongPress,选定的行在长按选择时打印到控制台也很好:

Long press on row, at 5