我以编程方式创建了许多UI元素。让我们说50 UILabels。 访问标签属性的正确方法是什么? 现在我在[subview]数组中为每个标签和下一个搜索标签添加标签,并通过发件人获取标签属性':
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(sender :)方法中,因为sender是UILongPressGestureRecognizer。
如果它适用于标签但不适用于按钮,似乎我做错了。 请指导我正确的方向
答案 0 :(得分:0)
在创建标签时简单添加此代码
const filtered = userArray.filter(user => {
let include = true;
Object.keys(deciders).forEach(type => include &= deciders[type](user, filter[type]));
return include;
});
使用 touchesBegan 方法获取点击后的标签
yourLbl.isUserInteractionEnabled = true
答案 1 :(得分:0)
首先,我会保留并使用对所有标签的引用进行数组,这样您就不必遍历所有子视图来查找它们,并将其保持在最高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)")
}
}
}
注意这里发生了什么: