首页 > 解决方案 > 如何以编程方式向 StackView 中的每个按钮添加单独的选择器/侦听器 swift 4.2

问题描述

我已经使用 for 循环以编程方式将按钮添加到 uistackview 中,但我希望每个按钮都有自己独立的侦听器,我想不出它的逻辑。我试图添加一个#selector,但显然它们都调用了相同的方法。

    for imageName in imagesArray1{
        let imageButton: UIButton = {
            let button = UIButton()
            let myUIImage = UIImage(named: imageName as! String)
            button.setImage(myUIImage, for: .normal)
            button.contentMode = .scaleAspectFit
            button.tag = buttonTag
            buttonTag += 1
            button.addTarget(self, action: #selector(handleSelectedAvatar(_:)), for:.touchUpInside)
            button.translatesAutoresizingMaskIntoConstraints = false
            return button
        }()
        stackView1.addArrangedSubview(imageButton)
        imageButton.widthAnchor.constraint(equalTo: stackView1.widthAnchor, multiplier: 1/4).isActive = true
        imageButton.heightAnchor.constraint(equalToConstant: UIScreen.main.bounds.width/4).isActive = true
    }

标签: iosswiftxcodeuistackviewswift4.2

解决方案


有2个解决方案。

1) 对所有按钮使用单个选择器:

button.tag = some_tag (Int)
button.addTarget(self, action: #selector(handleSelectedAvatar(_:)), for: .touchupInside)

handleSelectedAvatar执行:

@objc func handleSelectedAvatar(_ sender: UIButton) {
    switch sender.tag {
    case 0: // Do something with UIButton with tag 0
    case ...
    }
}

2)使用选择器数组:

let selectors = [#selector(handleSelectedAvatar), ...]

比为按钮设置选择器:

button.addTarget(self, action: selectors[your_index], for: .touchupInside)

推荐阅读