委托未被调用


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)
}
}

我做错了什么…????

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

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

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

最新更新