问题 如何使用Swift Selector?选择器不断导致`类型没有成员`


我正在努力使用以下代码:

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

5934
2018-05-02 05:07


起源

试试#selector(addNext)。 - gagarwal
尝试:#selector(GameViewController.addNext(_ :)) - Muhammad Yawar Ali
@Muhammad Yawar Ali #selector(GameViewController.addNext(_ :))结果为''GameViewController'没有成员'addNext` - user594883
@gagarwal #selector(addNext)结果为 Ambiguous use of 'addNext()' - user594883
您使用的是哪个版本的Xcode? - R P


答案:


我遇到了这个问题 UILongPressGestureRecognizer 和斯威夫特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


6
2017-12-08 22:20



正如你所描述的那样。 4个替代方案不起作用 - 只传递了班级名称。我也需要 @objc 在选择器功能的名称前面。 - James Toomey


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

2
2018-05-02 05:18



结果是 Use of unresolved identifier 'self' - user594883
backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(3,target:gvc,selector:Selector(gvc.addNext),userInfo:nil,重复:true)...试试这个 - Jayesh Miruliya


可能你的代码在不同的模块中。如果是这样你应该做你的 func addNext() 上市:

public func addNext() {
    ...
}

2
2018-05-02 05:22



它是。我公开了,但没有解决问题。上面编辑过的代码。 - user594883


你试过这个吗?

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)

2
2018-05-02 05:23



Stubborningly这拒绝工作。第一个结果是 Use of unresolved identifier 'self' 第二个 Value of type 'GameViewController' has no member 'addNext' - user594883


事实证明,问题是两件事。 1)我已经在类之外定义了方法,2)但是它还需要以下语法:

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


1
2018-05-03 18:49



这对我也有用。有人可以解释为什么所有其他方法都不起作用 - Abdul Hannan