【问题标题】:My delegate function is not being called in Swift我的委托函数没有在 Swift 中被调用
【发布时间】:2020-02-20 02:57:59
【问题描述】:

我有一个名为 NoteTakerViewController 的主视图。我有一个带有协议的weatherGetterController 类,该类使用一个名为getMyWeather 的协议函数返回5 天的天气。但是,没有调用将天气数据返回给 NoteTakerViewController 的协议函数。我确信我已经与代表正确设置了所有内容,但也许我没有。

这确实不是 Swift Delegate Not Being Called 的重复,因为该页面上的解决方案不起作用。

您能提供的任何帮助都会很棒。

这里是相关代码sn-ps:

我的 weatherGetterController 类:

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

class WeatherGetterController: UIViewController, CLLocationManagerDelegate {

var weatherGetterDelegate: WeatherGetterControllerDelegate?

并在 WeatherGetterController 中调用“getWeather”函数。线

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”被设置为nil,我不知道为什么。

谢谢

【问题讨论】:

  • weatherGetterDelegate赋值的代码在哪里?
  • 我没有那个,我想这就是我所缺少的,有什么提示可以放在哪里吗?
  • viewDidLoad 可能是个好地方
  • 我会在里面放什么,与 weatherGetterDelegate = self 或类似的东西有关吗?

标签: swift delegates delegation


【解决方案1】:

首先,您需要将 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 被定义为一个视图控制器,这真的正确吗?

class WeatherGetterController: UIViewController, CLLocationManagerDelegate {

我个人会删除那部分

lass WeatherGetterController: CLLocationManagerDelegate {

【讨论】:

  • 做到了!!!谢谢乔金!我也确实注意到了 UIViewController 并在早些时候将其删除,但感谢您的关注!我会将其标记为已回答。
【解决方案2】:

把它放在 WeatherGetterController 的 init 中

  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
 }

【讨论】:

  • 谢谢,但是 WeatherGetterController 不是一个视图,只是一个类,所以没有 ViewDidLoad 可用(如果我理解类)
  • 太棒了!这让我更容易更改我的代码
  • 告诉我一件事,你在哪里初始化 NoteTakerViewController?
猜你喜欢
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多