引用以编程方式创建的UI元素

引用以编程方式创建的UI元素

问题描述:

我以编程方式创建了许多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) 

} 

,现在我不能disableButton(发件人:)方法通过“发件人”访问属性,因为发件人是UILongPressGestureRecognizer。

似乎我做错了,如果它适用于标签,但不适用于按钮。 请,引导我在正确的方向

首先,我会保留并列出所有标签的引用,这样您就不必遍历所有子视图来查找它们,并按照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. 我们使用flatMap丢弃不UIlabels任何子视图。
  2. 我们使用last来查找数组中的最后一项( ,因为根据UIView.subviews,最上面的视图是最后一个视图)触摸位于视图边界内。

简单添加此代码,当你创建标签

yourLbl.isUserInteractionEnabled = true 

并使用的touchesBegan方法,让您的点击标签

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) –