【问题标题】:Delegate not get called代表没有被叫到
【发布时间】:2021-06-03 18:08:01
【问题描述】:
protocol WeatherManagerDelegate {
    func didUpdateWeater(weather: ConsolidatedWeather)
    func didFailWithError(error: Error)
}

ViewController:我在哪里设置值 didSelectRowAt 并使用 performSegue 转到另一个 viewController

   class WeatherListViewController: UIViewController {
            var delegate: WeatherManagerDelegate?

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            let index = weatherViewModel.didSelect(at: indexPath.row)
            self.delegate?.didUpdateWeater(weather: index)
            performSegue(withIdentifier: K.DetailsView.segueIndentifier, sender: self)
        }
        
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            let destinationVc = segue.destination as! DetailsViewController
            
        }
    
    }

这是我的 ViewModel 类:从我的 ViewModel,我会将值发送到 ViewController 并更新 UI

class DetailsWeatherViewModel{
    
    var  w = WeatherListViewController()
    
    func a(){
        print("aaa")
        w.delegate = self
    }
}


extension DetailsWeatherViewModel: WeatherManagerDelegate{
    func didUpdateWeater(weather: ConsolidatedWeather) {
        weatherData = weather
        print("weatherData: \(String(describing: weatherData))")
    }
    
    func didFailWithError(error: Error) {
        print(error)
    }
}

我做错了什么...????

【问题讨论】:

  • 你的介绍如何WeatherListViewController
  • 没找到你吗?
  • 抱歉,您在哪里展示WeatherListViewController?你能显示它的代码吗/
  • 让我们开始调试:self.delegate?.didUpdateWeater(weather: index) 那是您期望结果的行,不是吗?我们先看看,delegate 是 nil 吗?如果是这样,让我们​​找出原因。现在,我认为您的问题是因为您正在执行var w = WeatherListViewController(),它正在创建一个新实例,而不是您可能在屏幕上看到的实例。此外,它正在创建一个未连接到它的 Storyboard 的新实例,所以你会在 performSegue 上失败,它应该在尝试访问它的 IBOutlets 时崩溃,等等。

标签: swift mvvm delegates


【解决方案1】:

使用委托模式时应注意内存泄漏。我认为您可以通过将协议限制为class 并通过weak var 声明属性来解决此问题。虽然 WeatherListViewController 消失了,但 WeatherListViewController 和 DetailsWeatherViewModel 不太可能被 deinit,除非你使用弱引用。试试这个。

protocol WeatherManagerDelegate : class {
    func didUpdateWeater(weather: ConsolidatedWeather)
    func didFailWithError(error: Error)
}
weak var delegate: WeatherManagerDelegate?

【讨论】:

    【解决方案2】:

    如果您遵循 MVVM 架构,那么您可以在 viewcontroller 中创建一个 viewModel 对象,然后直接使用 VM 对象在 VM 中使用更新后的值。 否则,如果您想使用委托,则需要在 viewModel 中编写协议并在 VC 中使用它。您不应该在 Viewmodel 中创建 Viewcontroller 对象。

    【讨论】:

      猜你喜欢
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多