Search code examples
iosarraysswiftuiimageviewuitapgesturerecognizer

swift multiple views to tap gestures in array


I have an image slider where multiple images are added to a scrollview. Each is stored in an array of my custom data type (named Slide). I cycle through them like this:

    for (index, slide) in slides.enumerated() {
        let imageView = UIImageView()
        imageView.image = UIImage(named: slide.image)       //set the imageView with the imageName in this slide
        imageView.contentMode = .scaleAspectFit
        let xPos = self.view.frame.width * CGFloat(index)   //calculate x depending upon slide index
        imageView.frame = CGRect(x: xPos, y: -200, width: self.SVSlider.frame.width, height: self.SVSlider.frame.height)
        SVSlider.contentSize.width = SVSlider.frame.width * CGFloat(index + 1)  //add slide image to scrollview
        SVSlider.addSubview(imageView)

        //add tap function to slide
        imageView.isUserInteractionEnabled = true
        imageView.tag = index
        let tapImage = UITapGestureRecognizer(target: self, action: #selector(slideAction(_:)))
        imageView.addGestureRecognizer(tapImage)
    }

Each slide image is attached to the method "slideAction", below:

@objc func slideAction(_ sender: UITapGestureRecognizer) {
    let selName = slides[(sender.view?.tag)!].target
    NSObject.perform(Selector(selName))
}

But the application throws an error when I click an image. By debugging I can see that the "tag" is correctly set to the slide index number. I want to perform the target action held in the slide object. (Currently the target is a String of the method name - ending with ':').

How can I get the "slideAction" to goto the method in the slide object?


Solution

  • Try this ,create target method in the custom class callMethodDirectly and call it

    @objc func slideAction(_ sender: UITapGestureRecognizer) {
        let selName = slides[(sender.view?.tag)!]  
        selName.callMethodDirectly()
    }
    
    class slide:NSObjcet
    {
      func callMethodDirectly()
      {  
         // implement target code here
      }
    }