问题描述
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 对象。