web-dev-qa-db-ja.com

Swift)のUILabelに「addTarget」する方法

ループで追加されるラベルをSwiftに追加しようとしています。次に、追加された各イベントに「TapGesture」イベントを追加します。それは機能しますが、問題は、呼び出された関数がクリックされたときに使用するラベルからデータを取得することですが、ラベルはそれまでに再定義されており、クリックされたものではなく、最後に追加されたものからデータを取得します。それぞれを一意にするにはどうすればよいですか?

self.label.attributedText = self.myMutableString
let tapGesture = UITapGestureRecognizer(target: self, action: handleTap(label))
self.label.userInteractionEnabled=true
self.label.addGestureRecognizer(tapGesture)
self.label.font = UIFont.boldSystemFontOfSize(28)
self.label.sizeToFit()
self.label.center = CGPoint(x: screenWidth, y: top)
if(kilom>=30||self.located==false){
    self.scroller.addSubview(self.label)
    if(device=="iPhone"||device=="iPhone Simulator"){
        top = top+80
    }
    else{
        top = top+140
    }
}

以下のコードは、ラベルデータを取得して使用するジェスチャレコグナイザーです。

func handleTap(sender:UILabel){
    var a = self.label.text
    let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

    let resultViewController = storyBoard.instantiateViewControllerWithIdentifier("displayer") 

    self.presentViewController(resultViewController, animated: true, completion: nil)
}
9
gareth power

UITapGestureRecognizerのハンドラー関数には、UITapGestureRecognizersenderとして渡されます。 viewプロパティを使用して接続されているviewにアクセスできます。私はこのようなものを提案します:

func handleTap(sender: UITapGestureRecognizer) {
    guard let a = (sender.view as? UILabel)?.text else { return }

    ...
}

また、セレクターの署名を変更する必要があります。

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))

または以前のバージョンのSwiftの場合:

let tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:")
11
vacawama