从JSON中提取值并传递到Swift中的另一个ViewController

时间:2018-09-05 08:35:43

标签: ios json swift segue

我正在尝试从JSON中提取一个数字(ageInDays),然后将其传递给另一个View Controller。

如果我打印ageInDays,它将打印正确的答案,但是当我尝试将其传递给另一个VC时将返回nil,但是如果我将默认值传递给另一个VC,则它通过不会有问题。 我正在使用Alamofire和SwiftyJSON

我只包含了网络,解析和发送部分。

基本上,该应用程序会根据统计数据大致告诉您您还剩下多少天可以居住(这足以吓我一跳,一般情况下,我会做更多。)

var ageInDays = ""

//MARK: - Networking


func getAgeData(url: String){
    Alamofire.request(url, method: .get)
        .responseJSON { response in
            if response.result.isSuccess {
                print("Yes! We have the data!")
                let AgeJSON: JSON = JSON(response.result.value!)

                self.updateAgeData(json: AgeJSON)
            } else {
                print("Error: \(String(describing: response.result.error))")
                self.warningLabel.text = "Sorry, connection issues."
            }
    }
}

//MARK: - JSON Parsing

func updateAgeData(json: JSON) {

    if let ageResult = json["remaining_life_expectancy"].double{
    let ageInDays = (String((ageResult) * 365))
        print(ageInDays)
    } else {
        warningLabel.text = "Error: parsing JSON"
    }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let viewController = segue.destination as! ViewController
    viewController.ageFromSettings = ageInDays
}

@IBAction func calculateButtonPressed(_ sender: Any) {

    dateNowAsURL()
    if count > 0 {
        finalURL = "\(baseUrl)\(sex)\(URLcountry)\(URLdate)\(URLage)"
        print(finalURL)

        getAgeData(url: finalURL)
    }

    if ageInDays != ""{
        performSegue(withIdentifier: "sendingAgeData", sender: self)
    }

}

2 个答案:

答案 0 :(得分:0)

您的代码似乎有两个问题。

1)您的API调用是异步的,因此您在获得API响应之前正在执行Segue。您应该实现回调函数或在获取值后写此行。

self.updateAgeData(json: AgeJSON)
performSegue(withIdentifier: "sendingAgeData", sender: self)

2)您的变量“ ageInDays”。您永远不会为该变量分配任何值。在updateAgeData()函数中,您正在创建一个局部变量。您的全局变量没有获得该值。

像这样使用它

self.ageInDays = (String((ageResult) * 365))

答案 1 :(得分:0)

我的代码有2个问题:

  1. 由于Alamofire是异步的,因此必须在数据恢复后执行segue。

  2. 最大的问题实际上是确保通过segue发送的数据采用所需的形式。在这种情况下,它是Int而不是String。