2016-05-02 39 views
9

jestem zmaga się z następujący fragment kodu:Jak korzystać z Selektora Swift? Selector stale Wyników na `Type ma member`

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

I nie może wydawać się uzyskać #selector pracy. Ten kod powoduje do:

Type 'GameViewController' has no member 'addNext' 

Choć członkiem jest tam ... Oto pełny kod:

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

Po prostu spróbuj #selector (addNext). – gagarwal

+0

Wypróbuj: #selector (GameViewController.addNext (_ :)) –

+0

@Muhammad Yawar Ali #selector (GameViewController.addNext (_ :)) wyniki do ''GameViewController' nie ma członka 'addNext' – user594883

Odpowiedz

1

Okazuje się, że dwie rzeczy były problemem. 1) Ja zdefiniowane metody poza klasą, 2) Jednakże również składnia była potrzebna dla niej pracować:

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

+0

to działało również dla mnie. Czy ktoś może wyjaśnić, dlaczego wszystkie inne sposoby nie działają –

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

Powoduje to użycie 'nierozstrzygniętego identyfikatora 'self''' – user594883

+0

backgroundTimer = NSTimer.scheduledTimerWithTimeInterval (3, cel: gvc, selektor: Selektor (gvc.addNext), userInfo: nil, powtórzenia: true) ... spróbuj tego –

2

Prawdopodobnie kod jest w różnych modułach. Jeśli tak, należy dokonać func addNext() publicznej:

public func addNext() { 
    ... 
} 
+0

To jest. Dodałem publicznie, ale to nie rozwiązało problemu. Edycja kodu powyżej. – user594883

2

Próbowałeś tego.

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

lub

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

Powszechnie odmawia to działania. Pierwszy z nich to "Wykorzystanie nierozwiązanego identyfikatora" self'' i drugi "Wartość typu" GameViewController "nie ma członka 'addNext'' – user594883

3

biegałam w tej kwestii z UILongPressGestureRecognizer i Swift 3.

I miał mój sposób na przedłużenie przez długi prasy na komórce widoku tabeli:

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

Następnie w moim 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) 

Dla mnie problem został rozwiązany za pomocą tej składni dla selektora:

action: #selector(MyViewController.handleLongPress) 

Próbowałem następujące alternatywy bez powodzenia. te nie działają:

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

Dodatkowo, mimo że nie wydają się być przechodzącej żadnych argumentów MyViewController.handleLongPress The wybrany wiersz drukuje do konsoli po prostu dobrze po długim naciśnięciu wyboru:

Long press on row, at 5