引用以编程方式创建的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)")
}
}
}
注意什么回事:
- 我们使用flatMap丢弃不UIlabels任何子视图。
- 我们使用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
}
}
}
但是长时间敲击怎么办?我碰到没有问题只是触摸 – drywet
长期按[长按]这个链接(https://stackoverflow.com/questions/45243947/uilabel-long-press-gesture-for-menu-item-of-uimenucontroller) –