微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

代表没有被调用

如何解决代表没有被调用

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 对象。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。