2017-11-25 15 views
0

私はプログラムで多くのUI要素を作成しています。 50 UILabelsとしましょう。 ラベルプロパティにアクセスする適切な方法は何ですか? は、今私は、[サブビュー]配列内の各ラベルと次の検索ラベルにタグを追加すると「送信者」を介してラベルのプロパティを取得しています。私たちならば、いくつかの問題があるのでプログラムで作成されたUI要素の参照

func buttonTapped(sender: UIButton) { 

     for subview in containerView.subviews { 

      if let label = subview as? UILabel, label.tag == sender.tag { 
// do stuff 
} 
} 
} 

ない、それは最もエレガントな方法だと確信しラベルをボタンに変更します。

func createButton() { 
    let button = UIButton(frame: CGRect(origin: ..., 
             size: ...)) 

    button.addTarget(self, action: #selector(buttonTapped(sender:)), for: .touchUpInside) 

    let longTap = UILongPressGestureRecognizer(target: self, action: #selector(disableButton(sender:))) 
    longTap.minimumPressDuration = 1 
    button.addGestureRecognizer(longTap) 

    ....... 
    containerView.addSubview(button) 

} 

をし、送信者がUILongPressGestureRecognizerあるので、今、私は、disableButton(差出人:)方法で「送信者を経由してプロパティにアクセスすることはできません。

は言うことができます。

ラベルでは機能するが、ボタンでは機能しないと思っているようです。 、

答えて

0

まずを取得するためにtouchesBeganメソッドを使用し、正しい方向に私を導いてください。私はすべてのラベルへの参照を保持して配列していますので、すべてのサブビューを繰り返して検索し、z値の高い順に並べる必要はありません。しかし、あなたがここでそれをしたくない場合は、あなたが一行で見ることができるコードがあります。それは世界で最も効率的なものではありませんが、あなたの意見ではそれはうまくいくはずです。ここで起こっていただきました!

class ViewController: UIViewController { 
    let first = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 50)) 
    let second = UILabel(frame: CGRect(x: 25, y: 25, width: 100, height: 50)) 
    override func viewDidLoad() { 
     first.text = "first" 
     first.backgroundColor = .blue 
     second.text = "second" 
     second.backgroundColor = .red 
     view.addSubview(first) 
     view.addSubview(second) 
     let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:))) 
     view.addGestureRecognizer(tap) 
    } 
    @objc func handleTap(sender: UITapGestureRecognizer) { 
     if let label = view.subviews.flatMap({$0 as? UILabel}).last(where: { $0.bounds.contains(sender.location(in: $0))}) { 
      print("You pressed: \(label)") 
     } 
    } 
} 

注:

  1. 我々はUIlabelsではありませんサブビューを破棄するflatMapを使用しています。
  2. タッチがそのビューの境界内にある場合、最後に配列内の最後のアイテム( )が最後に使用されます。なぜなら、一番上のビューはUIView.subviewsに従って最後になるからです。
0

シンプルあなたがあなたのラベル

yourLbl.isUserInteractionEnabled = true 

を作成するときにこのコードを追加し、クリックされたラベル

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    let touch = touches.first 
    if let lblView = touch?.view 
    { 
     if lblView.isKind(of: UILabel.self) 
     { 
      let yourLbl = lblView as! UILabel 

      //Access your clicked lable 
     } 
    } 


} 
+0

しかし、長いタップはどうですか?私はちょうど触れても問題はありません – drywet

+0

このリンクを長く押すと[長押し](https://stackoverflow.com/questions/45243947/uilabel-long-press-gesture-for-menu-item-of-uimenucontroller) –

関連する問題