tccpg288
tccpg288

Reputation: 3352

Swift 3 - .addTarget() method not triggering Selector

I am trying to create dynamic radio buttons based on Firebase data. I am hoping to arrange the buttons in a vertical stack, and essentially when they are clicked I would hope for them to disappear and display another view:

class PollController: UIViewController {

@IBOutlet weak var passLabel: UILabel!
@IBOutlet weak var pollImage: UIImageView!
var ref: FIRDatabaseReference!
var pollRef: FIRDatabaseReference!

var pass = ""
var passedImageURL = ""

var posX = 0;
var posY = 0;

var buttons = [UIButton]()


override func viewDidLoad() {
    super.viewDidLoad()
    ref = FIRDatabase.database().reference()
    pollRef = ref.child("Polls").child(pass)
    passLabel.text = pass
    pollImage.sd_setImage(with: URL(string: passedImageURL), placeholderImage: UIImage(named: "test"))


    pollRef.observe(FIRDataEventType.value, with: {(snapshot) in
    let numberOfChildren = snapshot.childSnapshot(forPath: "answers").childrenCount
    self.passLabel.text = String(numberOfChildren)
    print(numberOfChildren)

    var stackView = UIStackView(arrangedSubviews: self.buttons)

        // create button1
    for x in 0..<numberOfChildren {
            let button = UIButton(frame: CGRect(x: self.posX, y: self.posY, width: 60, height: 20))
            button.setTitleColor(UIColor.black, for: .normal)
            button.setTitle("No", for: .normal)
            button.setImage(UIImage(named: "checkbox untick.png")!, for: .normal)
            // if the selected button cannot be reclick again, you can use .Disabled state
            button.setImage(UIImage(named: "checkboxredtick.png")!, for: .selected)
            button.tag = Int(x)
            button.addTarget(self, action: #selector(self.buttonAction(sender:)), for: .touchUpInside)

            stackView.addSubview(button)
            self.buttons.append(button)
            // create other buttons and add into buttons ...
        }
        })
    // Do any additional setup after loading the view.
}


func buttonAction(sender: UIButton!){
    for button in buttons {
        button.isSelected = false
    }
    sender.isSelected = true
    // you may need to know which button to trigger some action
    // let buttonIndex = buttons.indexOf(sender)
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
   }
}

enter image description here

Upvotes: 0

Views: 855

Answers (2)

ebby94
ebby94

Reputation: 3152

Your button declaration is func buttonAction(sender: UIButton!). Note that there are no underscore before sender. This means that you need to specify the name of the argument when you call the function. Replace the underscore in the selector with the argument name sender

button.addTarget(self, action: #selector(buttonAction(sender:)), for: .touchUpInside)

You can also add an underscore in front of the argument name in the function.

func buttonAction(_ sender: UIButton!)

Also, I noticed that the code is in Swift 3 seeing most of the syntax. So, the control event for touch up inside in Swift 3 is touchUpInside and not TouchUpInside

Upvotes: 1

Balaji Galave
Balaji Galave

Reputation: 1076

If you are using SWIFT 3.0 or later,

Then you must define add target method like below as _: is missing in the selector parameter.

button.addTarget(self, action: #selector(buttonAction(_:)), for: .TouchUpInside)

Also check id you have declares myStackview variable here. if you declared then try to add it as :

 self.myStackview

Upvotes: 3

Related Questions