簡體   English   中英

使用 MBProgressView 取消按鈕

[英]cancel button using MBProgressView

我正在嘗試將取消按鈕與 MBProgressView 一起使用。 我收到錯誤消息“無法將‘()’類型的值轉換為預期的參數類型‘Selector’”

hud.button.addTarget(hud.progressObject, action: cancelButton(), for: .touchUpInside)

我也試過這樣做:

hud.button.addTarget(hud.progressObject, action: #selector(cancelButton), for: .touchUpInside)

我收到錯誤消息“#selector 的參數無法引用本地函數‘cancelButton()’”。

誰能向我解釋我做錯了什么?

cancelButton 應該在 viewDidLoad 中,或者至少我需要找到一種方法來訪問 viewDidload 中的內容,因為我需要使用 hud 和 snapshot.progress 來取消下載:

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

    }

這是取消按鈕功能

 func cancelButton() {

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

    }

圖片1 圖2

試試這個 -

從你想用 Cancel 添加showHUDWithCancel的地方調用下面的 showHUDWithCancel。

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.
 }
}

在您的viewDidLoad中添加此代碼,它將起作用。

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


    }


}

viewDidLoad方法范圍之外的downloadTask定義移動到類本身。 這樣您就可以直接訪問任務,而不是通過觀察者傳遞的snapshot ,或者附加到 downloadTask 或progress的進度。 這樣做你可以從你的視圖控制器的任何方法訪問任務,包括cancelButton()

task.pause()

代替

snapshot.progress?.pause()

最終代碼可能如下所示:

class ViewController: UIViewController {

    var downloadTask: FIRStorageDownloadTask!

    ...

    override func viewDidLoad() {
        super.viewDidLoad()

        ...

        let reference = FIRStorage.storage().reference(forURL: (self.book?.bookURL)!)
        downloadTask = reference...

        ...

    }

}

注意:對於使用最新版本 MBProgressView 的用戶,按鈕文檔已更改:

/**
 * A button that is placed below the labels. Visible only if a target / action is added and a title is assigned..
 */

因此,創建應該類似於以下內容:

class Tools {

  static func popLoadingDialog(viewParent: UIView,
                                 label: String,
                                 cancelTarget: Any? = nil,
                                 cancelSelector: Selector? = nil) -> MBProgressHUD {

        let loadingNotification = MBProgressHUD.showAdded(to: viewParent, animated: true)
        loadingNotification.mode = MBProgressHUDMode.indeterminate
        loadingNotification.label.text = label
        if(cancelSelector != nil) {
            loadingNotification.button.setTitle("Cancel", for: .normal)
            loadingNotification.button.addTarget(cancelTarget, action: cancelSelector!, for: .touchUpInside)
        }
        return loadingNotification
    }
}

並稱之為:

loadingIndicator = Tools.createLoadingDialog(viewParent: view,
                                                      label: "Please wait...",
                                                      cancelTarget: self,
                                                      cancelSelector: #selector(onCancelClick))
loadingIndicator?.show(animated: true)

}

@objc func onCancelClick(){
        // do something when the user click on cancel...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM