代码之家  ›  专栏  ›  技术社区  ›  johnDoe

如何更新另一个UIViewController-SWIFT上的进度视图?

  •  2
  • johnDoe  · 技术社区  · 8 年前

    我有一个 UITableViewController 嵌入到 UINavigationController 。当我单击某一行时,我正试图上载文件。为了显示此上载的进度,我决定使用自定义弹出窗口(另一个 UIViewController )-如果有人有更好的想法来显示这方面的上传进度,我愿意接受。

    我唯一的想法是从一个 UIViewController 另一种方法(如果可能的话)是使用单例。下面是我的代码,我目前的问题是我不知道如何更新进度视图,即使现在它可以通过单例访问进度数据。

    class SharedSingleton{
    
         private init(){}
         static let shared = SharedSingleton()
         var prog: Float = 0
    }   
    

    UITableViewController:

    使用Alamofire获取已完成上载的分数:

     /**TRACK PROGRESS OF UPLOAD**/
     upload.uploadProgress { progress in
     //print(progress.fractionCompleted)
    
     let mySingleton = SharedSingleton.shared
     mySingleton.prog = Float(progress.fractionCompleted)
     print("mySingleton.prog: \(mySingleton.prog)")
    

    UIViewController包含弹出窗口:

    @IBOutlet weak var popUpContainer: UIView!
    @IBOutlet weak var uploadStatus: UILabel!
    @IBOutlet weak var progressBar: UIProgressView!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Make popup have rounded corners
        popUpContainer.layer.cornerRadius = 5
        popUpContainer.layer.masksToBounds = true
    
    
        // Call Singleton and assign progress of upload to progress view
        // HOW TO UPDATE ??????
        let mySingleton = SharedSingleton.shared
        progressBar.progress = mySingleton.prog
    
    }
    

    enter image description here

    1 回复  |  直到 8 年前
        1
  •  3
  •   barnabus    8 年前

    一种选择是使用 NotificationCenter 在弹出式视图控制器中订阅通知,并在API回调中发布通知。

    例如:

    UploadNotifications.swift :

    import Foundation
    
    extension Notification.Name {
        static let UploadProgress = Notification.Name("UploadProgress")
    }
    

    UploadProgressViewController.swift (您的弹出窗口):

    import UIKit
    
    class UploadProgressViewController: UIViewController {
    
        @IBOutlet weak var progressBar: UIProgressView!
    
        private let progress: Progress = {
            let progress = Progress()
            progress.completedUnitCount = 0
            progress.totalUnitCount = 100
            return progress
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
    
            NotificationCenter.default.addObserver(self, selector: #selector(self.uploadDidProgress(_:)), name: .UploadProgress, object: nil)
        }
    
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
        }
    
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            NotificationCenter.default.removeObserver(self)
        }
    
        @objc private func uploadDidProgress(_ notification: Notification) {
            if let progress = notification.object as? Int64 {
                self.progress.completedUnitCount = progress
                if progress == 100 {
                    // dismiss/exit
                }
            }
        }
    
    }
    

    然后在上载进度回调的方法中:

    upload.uploadProgress { progress in
        NotificationCenter.default.post(name: .SyncDidProgress, object: Int64(progress))
    }