Christie Christie - 5 months ago 16
Swift Question

How to call a method with a parameter on tap of an image?

I understand that the selector method cannot include arguments, but now I'm at a loss as to how I should go about what I want to do.

My objective is to have 5 UI Image Views, each with an image of a star. When the image is tapped, the star should swap images to grey or blue.

My question is, how do I write only one method that handles changing the star image, depending on which star is tapped? Ideally, I would like to send the image as an argument to the method, though I know that is not possible. The only way I can see around this is to write a method for each of the five stars, but as the code would be identical, I feel like there must be a better way.

On View Did Load:

// add tap recognition to rating stars
let tapGestureRecognizerOne = UITapGestureRecognizer(target:self, action:#selector(self.changeStar))
starOneEditImage.userInteractionEnabled = true
starOneEditImage.addGestureRecognizer(tapGestureRecognizerOne)
let tapGestureRecognizerTwo = UITapGestureRecognizer(target:self, action:#selector(self.changeStar))
starTwoEditImage.userInteractionEnabled = true
starTwoEditImage.addGestureRecognizer(tapGestureRecognizerTwo)
let tapGestureRecognizerThree = UITapGestureRecognizer(target:self, action:#selector(self.changeStar))
starThreeEditImage.userInteractionEnabled = true
starThreeEditImage.addGestureRecognizer(tapGestureRecognizerThree)
let tapGestureRecognizerFour = UITapGestureRecognizer(target:self, action:#selector(self.changeStar))
starFourEditImage.userInteractionEnabled = true
starFourEditImage.addGestureRecognizer(tapGestureRecognizerFour)
let tapGestureRecognizerFive = UITapGestureRecognizer(target:self, action:#selector(self.changeStar))
starFiveEditImage.userInteractionEnabled = true
starFiveEditImage.addGestureRecognizer(tapGestureRecognizerFive)


And then a method to call on tap of the image:

func changeStar() {

print ("star tapped")

}

Answer

I understand that the selector method cannot include arguments

You understand wrong. The parameter to changeStar is the gesture recognizer. And gesture recognizer has a view, and that's the image view you want!

func changeStar(g:UIGestureRecognizer) {
    let v = g.view as! UIImageView
    // ...
}
Comments