从 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的主要内容,如果未能解决你的问题,请参考以下文章
使用 almaofire 快速获取字典的所有值并传递给视图控制器
如何从 json 中提取数据并在 Next.js 中作为 props 传递
如何将数据从 Playground 页面传递到 Swift Playgrounds 中的另一个 Playground 页面?