Моя функция делегата не вызывается в Swift - PullRequest
0 голосов
/ 23 октября 2019

У меня есть основной вид с названием NoteTakerViewController. У меня есть класс weatherGetterController с протоколом, который возвращает 5 дней погоды с функцией протокола, называемой getMyWeather. Однако не вызывается функция протокола, которая возвращает данные о погоде в NoteTakerViewController. Я уверен, что у меня все правильно настроено с делегатами, но, возможно, у меня нет.

Это на самом деле не дубликат Swift Делегат не вызывается , поскольку решение на этой странице не сработало.

Любая помощь, которую вы могли бы предоставить, была бы полезной.

Вот соответствующие фрагменты кода:

Мой класс weatherGetterController:

protocol WeatherGetterControllerDelegate {
    func getMyWeather(weather: [FiveDayForecast])
}

class WeatherGetterController: UIViewController, CLLocationManagerDelegate {

var weatherGetterDelegate: WeatherGetterControllerDelegate?

И в вызове функции getWeather WeatherGetterController. Строка

self.weatherGetterDelegate?.getMyWeather(weather: myForecast)

не вызывается.

func getWeather() {
       ...
       getNetWeather { (fetchedInfo) in

            if let fetchedInfo2 = fetchedInfo {
                //self.updateUI(mainWeather: fetchedInfo2)
                //need to call delegate here
                let myForecast = self.figureFive(weather: fetchedInfo2)
                //return the forecast
                print(myForecast)
                self.weatherGetterDelegate?.getMyWeather(weather: myForecast)

            }

        }

Наконец, реализация функции в NoteTakerViewController:


class NoteTakerViewController: UIViewController, ..., UITextFieldDelegate, WeatherGetterControllerDelegate

    func getMyWeather(weather: [FiveDayForecast]) {

        print("get my weather")
        print(weather)

    }

Посредством отладки я вижу, что "weatherGetterDelegate"установлено в ноль, и я не знаю почему.

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Сначала вам нужно сделать WeatherGetterController свойством в NoteTakerViewController или локальной переменной, где вы его вызываете, но я буду использовать первую опцию.

class NoteTakerViewController: UIViewController, ..., WeatherGetterControllerDelegate {
    var weatherGetterController: WeatherGetterController?

    //...

    func viewDidLoad() {
         //....
         weatherGetterController = WeatherGetterController()
         weatherGetterController?.delegate = self
    }

   //And then in some other part of your code you do
   func someFunc() {
       self.weatherGetterController?.getWeather()

Мне любопытно, почему WeatherGetterController определен как viewcontroller,это действительно правильно?

class WeatherGetterController: UIViewController, CLLocationManagerDelegate {

Лично я бы удалил эту часть

lass WeatherGetterController: CLLocationManagerDelegate {
0 голосов
/ 23 октября 2019

Поместите это в инициализацию WeatherGetterController

  public weak var weatherGetterDelegate: WeatherGetterControllerDelegate?

  /* if you are not initializing it anywhere else 
  and if you are initializing it anywhere else then make sure you are 
  initializing WeatherGetterController there too and then put delegate   
  of WeatherGetterController to NoteTakerViewController object
   else write the below code */

  var model = NoteTakerViewController()

   public override init() {
      self. weatherGetterDelegate = model
 }
...