Обновите viewController из контроллера в MVC с помощью SWIFT - PullRequest
0 голосов
/ 01 июня 2019

Я создаю приложение с помощью swift.Приложение получает погоду из API openweathermap.com в классе WeatherDataModel, затем, когда данные загружаются, модель просит viewController обновить данные

Я на Xcode 10.2.1 с быстрым 5

Я создал протокол, который вызывается в модели для обновления данных, но updateDisplayDelegate? .UpdateWeatherDataOnDisplay () всегда равен nil, и даже если я получаю данные из JSON в консоли, он не будет обновляться на экране

class WeatherDataModel {

  var updateDisplayDelegate: ProtocolUpdateDisplay?

  func updateWeaterData(json : JSON) {
    updateDisplayDelegate?.updateWeatherDataOnDisplay()
  }
}

public protocol ProtocolUpdateDisplay {
    func updateWeatherDataOnDisplay()
}

class MainViewController: UIViewController {
  let weatherDataModel = WeatherDataModel()

  override func viewDidLoad() {
     super.viewDidLoad()
     weatherDataModel.updateDisplayDelegate = self
  }

extension MainViewController: ProtocolUpdateDisplay {

    func updateWeatherDataOnDisplay() {
        cityLabel.text = weatherDataModel.city
        tempLabel.text = weatherDataModel.temperature
        weatherIcon.image = UIImage(named: weatherDataModel.weatherIconName)
    }
}

1 Ответ

1 голос
/ 01 июня 2019

Не следует использовать шаблон delegation для модели. Рассмотрите возможность использования уведомления:

func updateWeaterData(json : JSON) {
    NotificationCenter.default.post(Notification(name: Notification.Name("WeatherDidUpdate")))
}

и обратите внимание на любой контроллер, который вы хотите ответить на это уведомление:

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(updateWeatherDataOnDisplay(_:)), name: Notification.Name("WeatherDidUpdate"), object: nil)
}

@objc func updateWeatherDataOnDisplay(_ notification: Notification) {
    cityLabel.text = weatherDataModel.city
    tempLabel.text = weatherDataModel.temperature
    weatherIcon.image = UIImage(named: weatherDataModel.weatherIconName)
}

и наконец удалите наблюдателя:

deinit {
    NotificationCenter.default.removeObserver(self)
}
...