Q:

cancel button using MBProgressView

I am trying to use cancel button with the MBProgressView. I am getting the error "cannot convert value of type '()' to expected argument type 'Selector'" 
hud.button.addTarget(hud.progressObject, action: cancelButton(), for: .touchUpInside)

I have also tried doing this: 
hud.button.addTarget(hud.progressObject, action: #selector(cancelButton), for: .touchUpInside)

and I got the error "Argument of #selector cannot refer to local function 'cancelButton()'".
Can anyone explain to me what am i doing wrong? 
cancelButton should be in viewDidLoad or at least I need to find a way to access what's inside viewDidload, because I need to use hud and snapshot.progress to cancel the download:
   override func viewDidLoad() {
        super.viewDidLoad()

        let appdelegate = UIApplication.shared.delegate as! AppDelegate
        appdelegate.orintation = UIInterfaceOrientationMask.allButUpsideDown
        if book?.bookPath !=  book?.bookPath {
            print("HERE \(book?.bookPath)")
            loadReader(filePaht: (book?.bookPath)!)
        } else {
            let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
            let strName = book?.id
            let filePath = "\(documentsPath)/"+strName!+".pdf"
            let fileManager = FileManager.default

            if fileManager.fileExists(atPath: filePath) {
                loadReader(filePaht: filePath)
                return;
            }

            print("DOWNLOAD #1")

            let reference = FIRStorage.storage().reference(forURL: (self.book?.bookURL)!)
            let downloadTask =  reference.data(withMaxSize: 50 * 1024 * 1024) { (data, error) -> Void in
                if (error != nil) {

                } else {

                    if ((try! data?.write(to: URL.init(fileURLWithPath: filePath, isDirectory: false))) != nil) {
                        self.db.upDate(id: (self.book?.id)!, bookPath: filePath)
                        self.loadReader(filePaht: filePath)
                    }
                }
            }
            downloadTask.observe(.resume) { (snapshot) -> Void in
                // Download resumed, also fires when the download starts
            }
            downloadTask.observe(.pause) { (snapshot) -> Void in
                // Download paused
            }

                downloadTask.observe(.progress) { (snapshot) -> Void in

            DispatchQueue.global(qos: .default).async(execute: {() -> Void in
                self.showHUDWithCancel("Downloading")
                DispatchQueue.main.async(execute: {() -> Void in
                })
            })

            self.hud.progressObject = snapshot.progress

        }
            downloadTask.observe(.success) { (snapshot) -> Void in
                // Download completed successfully

                print("Download Success")

                SwiftLoader.hide()
            }

            downloadTask.observe(.failure) { (snapshot) -> Void in
                //Download failed

                print("Download failed")
            }

        }

    }
    func showHUDWithCancel(_ aMessage: String) {
        self.hud = MBProgressHUD.showAdded(to: self.view, animated: true)
        self.hud.mode = MBProgressHUDMode.annularDeterminate
        self.hud.label.text = aMessage
        self.hud.detailsLabel.text = "Tap to cancel"
        let tap = UITapGestureRecognizer(target: self, action: #selector(cancelButton))
        self.hud.addGestureRecognizer(tap)
    }

    func cancelButton() {

       self.hud.hide(animated: true)
        self.hud.progressObject?.cancel()

        print("cancel button is working")

    }

This is the Cancel Button function
 func cancelButton() {

        MBProgressHUD.hide(for: view, animated: true)
         snapshot.progress?.pause()

    }

A:

Try this - 
Call below showHUDWithCancel from where you want to add hud with Cancel.
class ViewController: UIViewController {
   var hud = MBProgressHUD()

  override func viewDidLoad() {
    super.viewDidLoad()

  }
  func showHUDWithCancel(_ aMessage: String) {
    self.hud = MBProgressHUD.showAdded(to: self.view, animated: true)
    self.hud.label.text = aMessage
    self.hud.detailsLabel.text = "Tap to cancel"
    let tap = UITapGestureRecognizer(target: self, action: #selector(cancelButton))
    self.hud.addGestureRecognizer(tap)
}

func cancelButton() {
    self.hud.hide(animated: true)
    // do your other stuff here.
 }
}

Add this code within your viewDidLoad it will work.
 override func viewDidLoad() {
    super.viewDidLoad()

    let appdelegate = UIApplication.shared.delegate as! AppDelegate
    appdelegate.orintation = UIInterfaceOrientationMask.allButUpsideDown
    if book?.bookPath !=  book?.bookPath {
        print("HERE \(book?.bookPath)")
        loadReader(filePaht: (book?.bookPath)!)
    } else {
        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let strName = book?.id
        let filePath = "\(documentsPath)/"+strName!+".pdf"
        let fileManager = FileManager.default

        if fileManager.fileExists(atPath: filePath) {
            loadReader(filePaht: filePath)
            return;
        }

        print("DOWNLOAD #1")

        let reference = FIRStorage.storage().reference(forURL: (self.book?.bookURL)!)
          downloadTask =  reference.data(withMaxSize: 50 * 1024 * 1024) { (data, error) -> Void in
            if (error != nil) {

            } else {

                if ((try! data?.write(to: URL.init(fileURLWithPath: filePath, isDirectory: false))) != nil) {
                    self.db.upDate(id: (self.book?.id)!, bookPath: filePath)
                    self.loadReader(filePaht: filePath)
                }
            }
        }
        downloadTask.observe(.resume) { (snapshot) -> Void in
            // Download resumed, also fires when the download starts
        }
        downloadTask.observe(.pause) { (snapshot) -> Void in
            // Download paused
        }

       downloadTask.observe(.progress) { (snapshot) -> Void in OperationQueue.main.addOperation {
            OperationQueue.main.addOperation {
                self.hud.progressObject = snapshot.progress
                self.showHUDWithCancel("Downloading")
            }
          }
        }

        downloadTask.observe(.success) { (snapshot) -> Void in OperationQueue.main.addOperation {
            // Download completed successfully

            print("Download Success")
                OperationQueue.main.addOperation {
                 SwiftLoader.hide()
                }
            }
        }

        downloadTask.observe(.failure) { (snapshot) -> Void in OperationQueue.main.addOperation {
            //Download failed

            print("Download failed")
               OperationQueue.main.addOperation {
            _ = self.navigationController?.popViewController(animated: false)
            }
        }
        }

    }

}

