【问题标题】:How to use Swift Selector? Selector constantly results to `Type has no member`如何使用 Swift 选择器?选择器不断导致“类型没有成员”
【发布时间】:2016-08-26 19:09:15
【问题描述】:

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

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!)
    }
}

【问题讨论】:

  • 试试#selector(addNext)。
  • 试试:#selector(GameViewController.addNext(_:))
  • @Muhammad Yawar Ali #selector(GameViewController.addNext(_:)) 结果到`'GameViewController'没有成员'addNext`
  • @gagarwal #selector(addNext) 结果到Ambiguous use of 'addNext()'
  • 您使用的是哪个版本的 Xcode?​​span>

标签: ios swift sprite-kit selector nstimer


【解决方案1】:

我在使用 UILongPressGestureRecognizer 和 Swift 3 时遇到了这个问题。

我的方法在一个扩展中用于长按表格视图单元格:

// 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

【讨论】:

  • 和你描述的完全一样。 4 个替代方案不起作用——只有传递类的名称才起作用。我还需要 @objc 在选择器函数的名称前面。
【解决方案2】:

原来有两件事是问题所在。 1)我已经在类之外定义了方法,2)但是它还需要以下语法才能工作:

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

【讨论】:

  • 这对我也有用。有人可以解释为什么所有其他方法都不起作用
【解决方案3】:

你试过了吗?

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)

【讨论】:

  • 顽固地拒绝工作。第一个结果为Use of unresolved identifier 'self',第二个结果为Value of type 'GameViewController' has no member 'addNext'
【解决方案4】:

您的代码可能位于不同的模块中。如果是这样,您应该公开您的func addNext()

public func addNext() {
    ...
}

【讨论】:

  • 是的。我添加了公共,但它没有解决问题。上面编辑过的代码。
【解决方案5】:
backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("addNext"), userInfo: nil, repeats: true)

【讨论】:

  • 这个结果到Use of unresolved identifier 'self'
  • backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: gvc, selector: Selector(gvc.addNext), userInfo: nil, repeats: true)...试试这个
猜你喜欢
  • 2020-03-23
  • 1970-01-01
  • 2021-01-18
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 2017-02-08
相关资源
最近更新 更多