Как добавить отдельные селекторы / слушатели для каждой кнопки в StackView программно Swift 4.2 - PullRequest
0 голосов
/ 17 октября 2018

Я добавил кнопки в uistackview программно с помощью цикла for, но я хочу, чтобы у каждой кнопки были свои отдельные слушатели, и я не могу придумать логику для этого.Я пытался добавить #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
    }

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Прежде всего, вы должны отредактировать свой вопрос, просто опубликуйте код, и я отредактирую его для вас, если вам будет сложно сделать отступ или правильно отформатировать его.

Есть несколько способов, которыми я могу думатьделать то, что ты хочешь делать.Самое простое - использовать свойство кнопки tag кнопки.Этот тег должен помочь вам получить доступ к любому объекту (или UIImage в вашем случае) из вашего массива изображений.Назначьте тег на основе текущего индекса вашего цикла, тогда у каждой кнопки будет общий метод выбора.

import UIKit

class ViewController: UIViewController {

    internal lazy var stackView: UIStackView = {
        let stackView = UIStackView(arrangedSubviews: [])
        stackView.axis = .vertical
        stackView.alignment = .fill
        stackView.distribution = .fillEqually
        stackView.spacing = 10
        return stackView
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = .white

        // StackView Autolayout

        self.view.addSubview(self.stackView)
        self.stackView.translatesAutoresizingMaskIntoConstraints = false

        self.view.addConstraint(NSLayoutConstraint(item: self.stackView, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1.0, constant: 100.0))
        self.view.addConstraint(NSLayoutConstraint(item: self.stackView, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1.0, constant: 20.0))
        self.view.addConstraint(NSLayoutConstraint(item: self.stackView, attribute: .bottom, relatedBy: .equal, toItem: self.view, attribute: .bottom, multiplier: 1.0, constant: 20.0))

        // Add Buttons

        for index in 1...10 {
            let button = UIButton(type: .custom)
            button.backgroundColor = UIColor.gray
            button.setTitle("Button #\(index)", for: .normal)
            button.addTarget(self, action: #selector(self.buttonHandler(_:)), for: .touchUpInside)
            button.tag = index
            self.stackView.addArrangedSubview(button)
        }
    }

    @objc private func buttonHandler(_ button: UIButton) {
        print("Tapped button #:\(button.tag)")
    }
}

Надеюсь, это поможет!

0 голосов
/ 17 октября 2018

Существует 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...