【问题标题】:Trying seque data from UIViewController to Weather API尝试从 UIViewController 到 Weather API 的序列数据
【发布时间】:2019-07-15 14:08:58
【问题描述】:

我正在尝试将数据从 UIViewController 传递到从 WeatherAPI 获取数据的 SecondViewController。

 import UIKit

class ViewController: UIViewController {

@IBOutlet weak var raceTextField: UITextField!


let races = ["Melbourne", "Bahrain", "Shanghai", "Baku",
             "Barcelona", "Monaco", "Montreal","Le Castellet","Speilberg",
             "Silverstone","Hockenheimring","Budapest","Spa-Francorchamps","Monza","Singapore","Sochi","Suzuka","Austin","Interlagos","Abu Dhabi"]
var selectedRace: String?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    createRacesPicker()
    createToolbar()
}


@IBAction func sendButtonPressed(_ sender: Any) {
    performSegue(withIdentifier: "getWeather", sender: self)
}

func createRacesPicker() {
    let racePicker = UIPickerView()
    racePicker.delegate = self
    raceTextField.inputView = racePicker
}
func createToolbar() {
    let toolBar = UIToolbar()
    toolBar.sizeToFit()
    let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(ViewController.dismissKeyboard))
    toolBar.setItems([doneButton], animated: false)
    toolBar.isUserInteractionEnabled = true
    raceTextField.inputAccessoryView = toolBar
}
@objc func dismissKeyboard(){
    view.endEditing(true)
}
}
 //MARK: - UIPickerView Delegate extension
 /***************************************************************/
//UIPickerView here
 extension ViewController: UIPickerViewDelegate, UIPickerViewDataSource{
   func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
   }

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: 
Int) -> Int {
    return races.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return races[row]
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    selectedRace = races[row]
    raceTextField.text = selectedRace
}
//Write the PrepareForSegue Method here
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "getWeather" {
        let weatherVC = segue.destination as! WeatherViewController

        weatherVC.city = raceTextField.text!
       }
     }
   }

现在我想做的是用天气数据更新这个屏幕。下面是我更新weatherData的代码。 所以基本上将从视图控制器中选择的城市转移到 WeatherViewController

import UIKit
import CoreLocation
import Alamofire
import SwiftyJSON

class WeatherViewController: UIViewController {

//constants
let weatherDataModel = WeatherDataModel()

var city = ""

@IBOutlet weak var cityLabel: UILabel!
@IBOutlet weak var weatherIcon: UIImageView!
@IBOutlet weak var temperatureLabel: UILabel!

let WEATHER_URL = "http://api.openweathermap.org/data/2.5/weather"
let APP_ID = "8a99df7bf7ef4a4a202732c392b2d240"

override func viewDidLoad() {
    super.viewDidLoad()
    cityLabel.text = city
    // Do any additional setup after loading the view.
}

//MARK: - Networking
/***************************************************************/

//Write the getWeatherData method here:
func getWeatherData(url: String, parameters: [String : String]) {
    Alamofire.request(url, method: .get, parameters: parameters).responseJSON {
        response in
        if response.result.isSuccess {
            print("Success we got the weather data!")
            let weatherJSON : JSON = JSON(response.result.value!)
            self.updateWeatherData(json: weatherJSON)

        } else {
            print("Error \(String(describing: response.result.error))")
            //self because of the closure.  Therefore you have to specify the function.
            self.cityLabel.text = "Connection Issues"
        }

    }
}

//MARK: - JSON Parsing
/***************************************************************/
//updateweatherdata method here

func updateWeatherData(json: JSON) {
    if let tempResult = json["main"]["temp"].double {
        weatherDataModel.temperature = Int(tempResult - 273)
        weatherDataModel.city = json["name"].stringValue
        weatherDataModel.condition = json["weather"][0]["id"].intValue
        weatherDataModel.weatherIconName = weatherDataModel.updateWeathericon(condition: weatherDataModel.condition)
        userEnteredNewCityName(city: city)
        updateUIWithWeatherData()
    } else {
        cityLabel.text = "No data available"
    }

}

func userEnteredNewCityName(city: String){
    let params : [String : String] = ["q" : city, "appid" : APP_ID]
    getWeatherData(url: WEATHER_URL, parameters: params)
}

 //Write the updateUIWithWeatherData method here:


func updateUIWithWeatherData() {
    cityLabel.text = weatherDataModel.city
    temperatureLabel.text = String(weatherDataModel.temperature)
    weatherIcon.image = UIImage()
  }

 }

weatherDataModel 在一个单独的类中。所以我正在尝试将 MVC 添加到应用程序中。 我似乎看不到我错过了什么。这可能是一件非常简单的事情。任何帮助将不胜感激。

【问题讨论】:

  • 你在 WeatherViewController 中添加了名为 city 的字符串吗?
  • 您是否尝试将字符串raceTextField.text 保存在字符串变量中,然后再转到天气视图控制器。然后将该字符串传递给weatherVC.city以准备segue方法..
  • 现在看看。我使用 UIPickerView 来选择城市。
  • 这是我在 WeatherViewController 中添加的字符串。 var city = ""
  • 是因为city是空字符串吗?

标签: ios swift weather-api


【解决方案1】:

你必须调用方法来加载viewDidLoad中的数据

override func viewDidLoad() {
    super.viewDidLoad()
    cityLabel.text = city
    userEnteredNewCityName(city: city)
}

并删除该行

罢工>

userEnteredNewCityName(city: city)

updateWeatherData 否则你会陷入无限循环

【讨论】:

  • 感谢 Vadian,这真的很有帮助。现在 imageView 没有显示,但我稍后会尝试解决。
猜你喜欢
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 2021-06-20
  • 2016-11-04
  • 2020-02-20
  • 2012-05-16
相关资源
最近更新 更多