Как обновить представление прогресса на другом UIViewController - SWIFT? - PullRequest
0 голосов
/ 05 мая 2018

У меня есть UITableViewController, который встроен в UINavigationController. Когда я нажимаю на строку, я пытаюсь загрузить файл. Чтобы показать прогресс этой загрузки, я решил использовать собственное всплывающее окно (другое UIViewController) - если у кого-то есть идея показать прогресс загрузки в этом контексте, я открыт для него.

Единственная идея, которую я должен перенести непрерывные данные из одного UIViewController в другой (если это возможно), заключается в использовании Singleton. Мой код ниже, моя проблема на данный момент в том, что я не знаю, как обновить представление прогресса, хотя теперь у него есть доступ к данным прогресса через синглтон.

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 Ответ

0 голосов
/ 05 мая 2018

Одним из вариантов может быть использование 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))
}
...