Итак, давайте предположим, что у вас есть код, которому принадлежит значение прогресса.
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
}
}
}
Вот и все.Это просто общее описание того, как решать подобные задачи, так как я не знаю, как вы называете все классы и переменные в вашем коде.Возможно, вам следует немного подкорректировать решение под свой код.Обычно мы не применяем одноэлементный шаблон к представлениям, так как это может привести к довольно трудно отлаживаемому коду, когда представление может случайно исчезнуть с экрана и т. Д.