swiftselectormbprogresshud

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()

    }

picture 1 picture 2


Solution

  • 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)
                }
            }
            }
    
    
        }
    
    
    }