swiftxcodeswift3uiswipegesturerecognizer

call a func from different class in selector


I am using UIGestureRecognizer. I am trying to call a func from different class in the selector, but i am getting NSInvalidArgumentException when it executes.

import Foundation
import UIKit

class helperClass {

var onBoardingImageArray : [UIImage]?
var onBoardingPageControl : UIPageControl?
var onBoardingImageView : UIImageView?

init(imageArray : [UIImage] , pageControl : UIPageControl , yourImageView : UIImageView) {
    onBoardingImageArray = imageArray
    onBoardingPageControl = pageControl
    onBoardingImageView  = yourImageView

}


@objc func firstImageSwipeGestureAction(gesture :UIGestureRecognizer){
    if let swipeGesture = gesture as? UISwipeGestureRecognizer {
        switch swipeGesture.direction {
        case UISwipeGestureRecognizerDirection.right:
            if (onBoardingPageControl?.currentPage)! > 0{
                print("Swiped right")
                onBoardingPageControl?.currentPage -= 1
                self.onBoardingImageView?.image = onBoardingImageArray?[(onBoardingPageControl?.currentPage)!]
            }

        case UISwipeGestureRecognizerDirection.left:
            if (onBoardingPageControl?.currentPage)! < (onBoardingImageArray?.count)! - 1{
                print("Swiped left")
                onBoardingPageControl?.currentPage += 1
                self.onBoardingImageView?.image = onBoardingImageArray?[(onBoardingPageControl?.currentPage)!]
            }
        default:
            break
        }
    }
}

}


import UIKit

class MainController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.addTaped()
}

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

func addTaped(){
    let helpClasses : helperClass = helperClass.init(imageArray: self.firtImageViewArray! , pageControl:firstPageControl , yourImageView: firstImageView)

    let firstImageswipeGestureRecognizer = UISwipeGestureRecognizer(target: helpClasses, action: #selector(helpClasses.firstImageSwipeGestureAction))
    firstImageswipeGestureRecognizer.direction = .right
    self.firstImageView.isUserInteractionEnabled = true
    self.firstImageView.addGestureRecognizer(firstImageswipeGestureRecognizer)

    let firstImageswipeGestureRecognizerLeft = UISwipeGestureRecognizer(target: helpClasses, action: #selector(helpClasses.firstImageSwipeGestureAction))
    firstImageswipeGestureRecognizer.direction = .left
    self.firstImageView.isUserInteractionEnabled = true
    self.firstImageView.addGestureRecognizer(firstImageswipeGestureRecognizerLeft)


}

  @IBOutlet weak var firstImageView: UIImageView!
  @IBOutlet weak var firstPageControl: UIPageControl!
  let firtImageViewArray : [UIImage]? = [#imageLiteral(resourceName: "Eagle9")]

}

Solution

  • You are setting up everything right, but make one mistake, when you initialise your helpClasses.

    Because you declare the helpClasses variable inside the scope of addTaped() function, it will be allocated on the stack. As soon as your function finishes, helpClasses variable will be deallocated, removed from the stack, and it becomes nil. From than on, you are sending messages to an object, what is nil, therefore it is understandable, that nothing happens.

    To overcome on this problem, declare your variable on the heap, outside of you functions scope. Best is if you declare it on the scope of your MainController.

    Example:

    import UIKit
    
    class MainController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    
        self.addTaped()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func addTaped(){
    // Initialise helpclasses here, but not as a local variable!!
        helpClasses = helperClass.init(imageArray: self.firtImageViewArray! , pageControl:firstPageControl , yourImageView: firstImageView)
    
        let firstImageswipeGestureRecognizer = UISwipeGestureRecognizer(target: helpClasses, action: #selector(helpClasses.firstImageSwipeGestureAction))
        firstImageswipeGestureRecognizer.direction = .right
        self.firstImageView.isUserInteractionEnabled = true
        self.firstImageView.addGestureRecognizer(firstImageswipeGestureRecognizer)
    
        let firstImageswipeGestureRecognizerLeft = UISwipeGestureRecognizer(target: helpClasses, action: #selector(helpClasses.firstImageSwipeGestureAction))
        firstImageswipeGestureRecognizer.direction = .left
        self.firstImageView.isUserInteractionEnabled = true
        self.firstImageView.addGestureRecognizer(firstImageswipeGestureRecognizerLeft)
    
    
    }
    
      @IBOutlet weak var firstImageView: UIImageView!
      @IBOutlet weak var firstPageControl: UIPageControl!
      let firtImageViewArray : [UIImage]? = [#imageLiteral(resourceName: "Eagle9")]
      // Move your helpClasses variable here
      var helpClasses: helperClass!
    }