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

Posted

技术标签:

【中文标题】从 JSON 中提取值并传递给 Swift 中的另一个 ViewController【英文标题】:Extracting value from JSON and passing to another ViewController in Swift 【发布时间】:2018-09-05 08:35:42 【问题描述】:

我正在尝试从 JSON 中提取一个数字 (ageInDays),然后将其传递给另一个视图控制器。

如果我打印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)
    


【问题讨论】:

问题:您错过了 Alamofire 请求是 ASYNCHRONE 的事实。将getAgeData(url: finalURL) 替换为getAgeData(url: finalURL); print("After getAgeData"); 并检查print("Yes! We have the data!") 是在之前还是之后打印的。如何管理它们:寻找“Swift + Closure + Async”。 谢谢,这真的很有帮助!我做出了改变,“是的!我们有数据!”在给出结果之前打印。再次感谢! 【参考方案1】:

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

1) 您的 API 调用是异步的,因此您在获得 API 响应之前执行 Segue。你应该要么实现一个回调函数,要么在你得到值后写下这一行。

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

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

这样使用

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

【讨论】:

【参考方案2】:

我的代码有 2 个问题:

    因为 Alamofire 是异步的,所以我必须在取回数据后执行 segue。

    最大的问题实际上是确保通过 segue 发送的数据符合所需的格式。在这种情况下,作为 Int,而不是 String。

【讨论】:

以上是关于从 JSON 中提取值并传递给 Swift 中的另一个 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

从响应中获取值并转移到 React 中的另一个组件

将大型 JSON 对象传递到新窗口中的另一个页面。

使用 almaofire 快速获取字典的所有值并传递给视图控制器

如何从 json 中提取数据并在 Next.js 中作为 props 传递

如何将数据从 Playground 页面传递到 Swift Playgrounds 中的另一个 Playground 页面?

如何将 JSON 响应发送到 Swift 3 中的另一个视图