Как обновить круглую кнопку прогресса на двух контроллере вида? Я использую синглтон-класс для круговой кнопки прогресса - PullRequest
1 голос
/ 08 июля 2019

Я создал пользовательскую круглую кнопку прогресса. Теперь я хотел показать его на двух контроллерах представления с одинаковым прогрессом.

Я создал синглтон-класс, чтобы только один экземпляр обновлялся на обоих контроллерах представления. Ниже приведен синглтон-класс.

class DownloadView: UIView 
{

    @IBOutlet var contentView: UIView!
    @IBOutlet var circleProgressButton: MyCircularProgressButton!
    @IBOutlet var progressLbl: UILabel!

    static var downloadView = DownloadView()


    func sharedInstance(frame:CGRect)
    {
        self.frame = frame
        commonInit()
    }

    private func commonInit()
    {
        Bundle.main.loadNibNamed("DownloadView", owner: self, options: nil)
        contentView.fixInView(self)
    }
}

extension UIView
{
    func fixInView(_ container: UIView!) -> Void
    {
            self.frame = container.frame
            container.addSubview(self)
    }
}

Фактический результат - Я нахожусь на контроллере представления 1, и он содержит круглую кнопку прогресса, он начнет обновлять статус прогресса. Теперь, если я перейду на контроллер просмотра 2, он также содержит круглую кнопку прогресса, он также начнет обновлять прогресс. Теперь, если я перейду с контроллера просмотра 2 на контроллер просмотра 1, круговая кнопка прогресса на контроллере просмотра 1 остановится.

Ожидаемый результат - Если я перейду с контроллера просмотра 1 на контроллер просмотра 2 или наоборот, он должен продолжить обновление круговой кнопки прогресса на обоих контроллерах просмотра одновременно.

Ответы [ 3 ]

1 голос
/ 08 июля 2019

Здесь вы найдете все функциональные возможности Возможно, вам понадобится дополнительная цепочка, поэтому приложите некоторые усилия;)

  protocol DownloadDelegate {
    func updateProgress(updatedProgress:Double)
}
    let AppUtility =  Utility.sharedUtility()
    class Utility: NSObject {
       var progeess:Double = 0.0
        var delegate:DownloadDelegate?
        class func sharedUtility()->Utility!
        {
            struct Static
            {
                static var sharedInstance:Utility?=nil;
                static var onceToken = 0
            }
            Static.sharedInstance = self.init();
            return Static.sharedInstance!
        }
        required override init()
        {

        }
        func netwrokCall(){
            progress = updatedProgress
            delegate.updateProgress(updatedProgress:progress)
    }
    }
  class firstViewController:UIViewController, DownloadDelegate{
       func  viewDidLoad(animated:Bool){
          AppUtility.delegate=self
          AppUtility.networkCall()
      }
    func updateProgress(updatedProgress:Double){
    progressLbl.text = "\(progess)%"
    circleProgressButton.progess = progess
}
    }
     class secondndViewController:UIViewController, DownloadDelegate{
  func  viewDidLoad(animated:Bool){
          AppUtility.delegate=self
      }
     func updateProgress(updatedProgress:Double){
        progressLbl.text = "\(progess)%"
        circleProgressButton.progess = progess
}

    }
1 голос
/ 08 июля 2019

Спасибо, ребята, что помогли мне. Я ответил на оба ответа. Теперь, попробовав разные способы, я наконец понял, как решить эту проблему. без синглтона, я должен решить эту проблему. Я сделал объект DownloadView статическим как в контроллере представления, так и в доступе к нему из класса DownloadService. Теперь из класса DownloadService я изменяю значение прогресса в обоих контроллерах представления.

1 голос
/ 08 июля 2019

Итак, давайте предположим, что у вас есть код, которому принадлежит значение прогресса.

final class ProgressOwner {
    var progress: Float = 0
    init() {}
}

let progressOwner = ProgressOwner()

Нам нужен способ получать уведомления и обновлять значение в вашем представлении прогресса.Это может быть достигнуто с помощью одной из платформ (NSNotificationCenter, ReactSwift, Combine framework и т. Д.) Или реализовано вручную следующим образом:

final class ProgressOwner {
    var progress: Float = 0 {
        didSet {
            observers.forEach { $0(progress) } // When the progress changes we send it to every observer
        }
    }

    private var observers: [(Float) -> ()] = [] // Store all the observers.
    // Note that we store closures, so should be careful with memory management

    init() {}

    func observeProgress(_ callback: @escaping (Float) -> ()) {
        DispatchQueue.main.async {          // Making sure it is the main thread just not to break something in UI
            self.observers.append(callback) // Adding callback as an observer
            callback(self.progress)         // Reporting current progress so that view can update
        }
    }
}

Осталось только настроитьпросмотр в контроллере вида.Регулярно это удобно делать в viewDidLoad методе:

final class ViewController: UIViewController {

    let progress: ProgressOwner = ...      /// Need to setup the progress owner that you have
    let progressView = MyCircularProgressButton()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(progressView)    // Adding progress view
        NSLayoutConstraint.activate([    // Placing the progress view in the center as an example. We use constraints here, but it can be achieved by setting its frame too
            progressView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            progressView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
        // Adding connection to the progress updates
        progress.observeProgress { [weak progressView] progress in
            progressView?.progress = progress // Updating theprogress displayed by the view
        }
    }
}

Вот и все.Это просто общее описание того, как решать подобные задачи, так как я не знаю, как вы называете все классы и переменные в вашем коде.Возможно, вам следует немного подкорректировать решение под свой код.Обычно мы не применяем одноэлементный шаблон к представлениям, так как это может привести к довольно трудно отлаживаемому коду, когда представление может случайно исчезнуть с экрана и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...