簡體   English   中英

為什么自委托為零?

[英]Why self delegate is nil?

我想通過使用 openweathermap api 添加城市名稱來制作天氣應用程序。 但是我無法將我在 AddCityViewController 中添加的城市發送回 HomeViewController。 因為, self?.delegate 在 AddCityViewController.swift 中為零

 @objc private func didTapSaveButton() {
    print("clicked save button")
    
    if let city = cityTextfield.text {
        
        let weatherURL = URL(string: "https://api.openweathermap.org/data/2.5/weather?q=\(city)&APPID=b4251cb51691654da529bccf471596bc&units=imperial")!
        
        let weatherResource = Resource<WeatherViewModel>(url: weatherURL) { data in
            
            let weatherVM = try? JSONDecoder().decode(WeatherViewModel.self, from: data)        
            return weatherVM
        }
        
        Webservice().load(resource: weatherResource) { [weak self] result in
            if let weatherVM = result {
                
                if let delegate = self?.delegate {
                    delegate.addWeatherDidSave(vm: weatherVM)
                    self?.dismiss(animated: true, completion: nil)
                }
            }
        }
    }
}

當我調試 HomeViewController.swift 中的准備函數時,沒有被調用。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    
    guard let nav = segue.destination as? UINavigationController else {
        fatalError("NavigationController not found")
    }
    
    guard let addWeatherCityVC = nav.viewControllers.first as? AddCityViewController else {
        fatalError("AddWeatherCityController not found")
    }
    
    addWeatherCityVC.delegate = self
    
}

我想要的是,當用戶按下保存按鈕時,我想將城市名稱傳遞回 HomeViewController。

extension HomeViewController: AddWeatherDelegate {
   func addWeatherDidSave(vm: WeatherViewModel) {
      print(vm.name)
   }  
}

GitHub 中的源代碼

您沒有使用 segue 進行導航,因此不會觸發 prepareForSegue 方法。 在您的代碼中,您正在手動初始化AddCityViewController一個實例並呈現它。 因此,要解決此問題,您必須將委托設置為該實例。

@objc private func didTapAddButton() {
   let vc = AddCityViewController()
   vc.title = "Add City"
   vc.delegate = self
   let nav = UINavigationController(rootViewController: vc)
   nav.modalPresentationStyle = .fullScreen
   present(nav, animated: true)
 }

否則,您可以使用 segue 進行導航。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM