2014-11-21 20 views
8

Aggiungere un UITapGestureRecognizer:tapGesture, Voglio che quando faccio clic su (tocca) l'etichetta, klikPlay() eseguirà le sue azioni.Aggiunta di TapGestureRecognizer a UILabel in Swift

quando si esegue il codice e fare clic/tocco l'etichetta, si dà questo errore:

unrecognized selector sent to instance.

Si tratta di circa l'etichetta Player(named: label), il UITapGestureRecognizer(named:tapGesture) e la funzione klikPlay

Cosa faccio di sbagliato ?

override func didMoveToView(view: SKView) { 

let background = SKSpriteNode(imageNamed: "bgStart2") 
background.position = CGPoint(x:0, y:0) 
background.anchorPoint=CGPoint(x:0,y:1.0) 
background.size = frame.size 
addChild(background) 


//label Play 
var label: UILabel = UILabel() 
label.frame = CGRectMake(frame.size.width/4, frame.size.height/9, frame.size.width, frame.size.height/6) 
label.text = "Play" 
label.font = UIFont(name: "Noteworthy-Bold", size:50) 
label.textColor = UIColor.whiteColor() 
label.textAlignment = NSTextAlignment.Center 
label.center = CGPointMake(frame.size.width/2, 4 * frame.size.height/8) 
label.hidden = false 

//label map 
var label2: UILabel = UILabel() 
label2.frame = CGRectMake(frame.size.width/4, frame.size.height/9, frame.size.width, frame.size.height/6) 
label2.text = "Map" 
label2.font = UIFont(name: "Noteworthy-Bold", size:50) 
label2.textColor = UIColor.whiteColor() 
label2.textAlignment = NSTextAlignment.Center 
label2.center = CGPointMake(frame.size.width/2, 5 * frame.size.height/8) 
label2.hidden = false 

//label sounds 
var label3: UILabel = UILabel() 
label3.frame = CGRectMake(frame.size.width/4, frame.size.height/9, frame.size.width, frame.size.height/6) 
label3.text = "Sounds" 
label3.font = UIFont(name: "Noteworthy-Bold", size:50) 
label3.textColor = UIColor.whiteColor() 
label3.textAlignment = NSTextAlignment.Center 
label3.center = CGPointMake(frame.size.width/2, 6 * frame.size.height/8) 
label3.hidden = false 


//label info 
var label4: UILabel = UILabel() 
label4.frame = CGRectMake(frame.size.width/4, frame.size.height/9, frame.size.width, frame.size.height/6) 
label4.text = "Info" 
label4.font = UIFont(name: "Noteworthy-Bold", size:50) 
label4.textColor = UIColor.whiteColor() 
label4.textAlignment = NSTextAlignment.Center 
label4.center = CGPointMake(frame.size.width/2, 7 * frame.size.height/8) 
label4.hidden = false 

self.view?.addSubview(label) 
self.view?.addSubview(label2) 
self.view?.addSubview(label3) 
self.view?.addSubview(label4) 

label.userInteractionEnabled = true 
label2.userInteractionEnabled = true 
label3.userInteractionEnabled = true 
label4.userInteractionEnabled = true 

//the UITapGestureRecognizer 
let tapGesture = UITapGestureRecognizer(target: self, action: "klikPlay:") 
label.addGestureRecognizer(tapGesture) 
view.addGestureRecognizer(tapGesture) 



    //the functions I want to run 
func klikPlay(sender:UITapGestureRecognizer){ 
    var scene:GameScene! 
    self.runAction(SKAction.sequence([SKAction.waitForDuration(0.0), 
     SKAction.runBlock({ 
      // var transition:SKTransition = SKTransition.flipHorizontalWithDuration(0.5) 
      var scene1:SKScene = GameScene(size: self.size) 
      self.view?.presentScene(scene1) 
      label.removeFromSuperview() 
      label2.removeFromSuperview() 
      label3.removeFromSuperview() 
      label4.removeFromSuperview() 
      background.removeFromParent() 
     }) 
     ])) 
} 
} 

risposta

6

Sembra che tu abbia dichiarato klikPlay in funzione annidata all'interno didMoveToView:

override func didMoveToView(view: SKView) { 
    // ... 
    let tapGesture = UITapGestureRecognizer(target: self, action: "klikPlay:") 

    func klikPlay(sender:UITapGestureRecognizer){ 
     // ... 
    } 
} 

ne avete bisogno come un metodo della classe per il sistema di riconoscimento gesto esempio per trovare in modo corretto:

class MyView { 
    var label: UILabel! 
    // ... 

    override func didMoveToView(view: SKView) { 
     label = UILabel() 
     label.frame = CGRectMake(...) 
     // ... 
     let tapGesture = UITapGestureRecognizer(target: self, action: "klikPlay:") 
    } 

    func klikPlay(sender:UITapGestureRecognizer){ 
     // ... 
    } 
} 
+0

ringraziamento, ma quando lo faccio, le etichette non sono riconosciuti nella funzione klikplay più perché sono dichiarate nella funzione viewDidLoad. come lo risolvo? grazie! – DNC

+0

Dovresti dichiararli come variabili di istanza della tua classe - vedi il mio aggiornamento. –

+4

Non dimenticare di abilitare 'userInteractionEnabled' per' UILabel' ... – Chris

10

piuttosto semplice

let tap:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "labelAction:") 
mylabel.addGestureRecognizer(tap) 
tap.delegate = self // Remember to extend your class with UIGestureRecognizerDelegate 

// Receive action 
func labelAction(gr:UITapGestureRecognizer) 
{ 
    let searchlbl:UILabel = (gr.view as! UILabel) // Type cast it with the class for which you have added gesture 
    print(searchlbl.text)  
} 
11

Sulla base di answer from Taimur Ajmal, aggiornato per 2.X Swift:

override func viewDidLoad() { 
    super.viewDidLoad() 

    ... 

    labelDemo.userInteractionEnabled = true // Remember to do this 
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(
     target: self, action: #selector(didTapLabelDemo)) 
    labelDemo.addGestureRecognizer(tap) 
    tap.delegate = self // Remember to extend your class with UIGestureRecognizerDelegate 

    ... 
} 

func didTapLabelDemo(sender: UITapGestureRecognizer) 
{ 
    print("you tapped label \(sender)") 
}