参考以编程方式创建的UI元素

时间:2017-11-25 12:48:28

标签: ios swift3

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

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

2 个答案:

答案 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)")
        }
    }
}

注意这里发生了什么:

  1. 我们使用flatMap来丢弃任何非UIlabels的子视图。
  2. 我们使用last来查找数组中的最后一项( 因为最顶层的视图是最后一个根据UIView.subviews),其中触摸在该视图的范围内。