2016-07-11 13 views
2

Ich habe zwei Etiketten, Label1 und Label2. Ich möchte eine einzelne Funktion erstellen, die ausgibt, welche Beschriftung angezapft wird, indem ich UITTapRecognizer für beide Beschriftungen erzeuge, die dieselbe Funktion mit selector aufrufen, der ein Argument übergibt. Unten ist der lange Weg, es zu tun, der chaotisch ist aber funktioniert. Wenn ich weiß, wie man ein Argument (Int) in den Selektor eingibt, wäre es viel sauberer.Pass extra Argument für UItapgestureRecognizer mit Selektor

let topCommentLbl1Tap = UITapGestureRecognizer(target: self, action: #selector(DiscoverCell().doubleTapTopComment1)) 
    topCommentLbl1Tap.numberOfTapsRequired = 2 
    topCommentLbl1.userInteractionEnabled = true 
    topCommentLbl1.addGestureRecognizer(topCommentLbl1Tap) 

let topCommentLbl2Tap = UITapGestureRecognizer(target: self, action: #selector(DiscoverCell().doubleTapTopComment2)) 
     topCommentLbl2Tap.numberOfTapsRequired = 2 
     topCommentLbl2.userInteractionEnabled = true 
     topCommentLbl2.addGestureRecognizer(topCommentLbl2Tap) 

func doubleTapTopComment1() { 
    print("Double Tapped Top Comment 1") 
} 
func doubleTapTopComment2() { 
    print("Double Tapped Top Comment 2") 
} 

Gibt es eine Möglichkeit die Auswahlverfahren so zu modifizieren, dass ich so etwas wie

func doubleTapTopComment(label:Int) { 
    if label == 1 { 
     print("label \(label) double tapped") 
} 

Antwort

2

Kurze Antwort tun können: keine

Der Wähler durch die UITapGestureRecognizer genannt wird, und Sie haben keine Einfluss auf welche Parameter es passiert.

Sie können jedoch die Eigenschaft view des Erkenners abfragen, um die gleichen Informationen zu erhalten.

func doubleTapComment(recognizer: UIGestureRecognizer) { 
    if recognizer.view == label1 { 
     ... 
    } 
    else if recognizer.view == label2 { 
     ... 
    } 
} 
2

Stellen Sie beide Gestenerkenner mit demselben Selektor zur Verfügung, der einen einzelnen Parameter akzeptiert. Diese Aktionsmethode wird in der Instanz UIGestureRecognizer übergeben, und glücklicherweise hat dieser Gestenerkenner eine Eigenschaft namens view, die die Ansicht ist, an die das GR angehängt ist.

... action: #selector(doubleTapTopComment(_:)) 

func doubleTapTopComment(gestureRecognizer: gr) { 
    // gr.view is the label, so you can say gr.view.text, for example 
} 
1

Ich glaube, eine UITapGestureRecognizer kann nur für eine einzige Ansicht verwendet werden. Das heißt, Sie können 2 verschiedene UITapGestureRecognizer s rufen Sie den gleichen Selektor und dann Zugriff auf die UITapGestureRecognizer in der Funktion. Siehe den folgenden Code:

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 

     super.viewDidLoad() 

     let label1 = UILabel() 
     label1.backgroundColor = UIColor.blueColor() 
     label1.frame = CGRectMake(20, 20, 100, 100) 
     label1.tag = 1 
     label1.userInteractionEnabled = true 
     self.view.addSubview(label1) 

     let label2 = UILabel() 
     label2.backgroundColor = UIColor.orangeColor() 
     label2.frame = CGRectMake(200, 20, 100, 100) 
     label2.tag = 2 
     label2.userInteractionEnabled = true 
     self.view.addSubview(label2) 

     let labelOneTap = UITapGestureRecognizer(target: self, action: #selector(ViewController.whichLabelWasTapped(_:))) 
     let labelTwoTap = UITapGestureRecognizer(target: self, action: #selector(ViewController.whichLabelWasTapped(_:))) 

     label1.addGestureRecognizer(labelOneTap) 
     label2.addGestureRecognizer(labelTwoTap) 

} 

Beide UITapGestureRecognizer s die gleiche Funktion aufrufen:

func whichLabelWasTapped(sender : UITapGestureRecognizer) { 
    //print the tag of the clicked view 
    print (sender.view!.tag) 
} 

Wenn Sie versuchen, auf beiden Labels eine der UITapGestureRecognizer s hinzufügen, dann wird nur die letzte hinzugefügt tatsächlich nennen die Funktion.