Swift 3在视图控制器之间传递数据
问题描述:
我试图将数据从一个控制器传递到下一个控制器。该代码是如下Swift 3在视图控制器之间传递数据
首先视图控制器:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let parameters: Parameters = [
"x": 2,
"y": 2
]
Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.default).responseJSON { response in
if((response.result.value) != nil) {
let jsonVar: JSON = JSON(response.result.value ?? "success")
let destViewController : JSONResult = segue.destination as! JSONResult
let result = "\(jsonVar)"
destViewController.textLabel = result
print(result)
//self.jsonDisplayError.text = "\(jsonVar)"
} else {
self.jsonDisplayError.text = "no response"
}
}
}
第二视图控制器:
@IBOutlet var jsonResult: UILabel!
var textLabel = String()
override func viewDidLoad() {
jsonResult.text = textLabel
}
结果被输出到控制台正确,但它不是在对标签显示第二视图控制器页面。
答
我认为这个问题是在异步回调发送数据时,你已经在这里两个选项,
首个解决方案
参数传递给secondviewcontroller并就secondviewcontroller的viewDidLoad事件API请求。
class FirstViewController: UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let parameters: Parameters = [
"x": 2,
"y": 2
]
destViewController.parametrs = parameters
}
}
而且secondviewcontroller,
class SecondViewController: UIViewController {
@IBOutlet var jsonResult: UILabel!
var parameters: Parameters
override func viewDidLoad() {
Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.default).responseJSON { response in
if((response.result.value) != nil) {
let jsonVar: JSON = JSON(response.result.value ?? "success")
jsonResult.text = result
} else {
self.jsonDisplayError.text = "no response"
}
}
}
}
第二种解决
创建两个视图控制器之间的塞克(不点击链接等),以及performSegue
手动当你异步回调完成,
class FirstViewController: UIViewController {
var result = ""
@IBAction func buttonClick(sender: UIButton) {
let parameters: Parameters = [
"x": 2,
"y": 2
]
Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.default).responseJSON { response in
if((response.result.value) != nil) {
let jsonVar: JSON = JSON(response.result.value ?? "success")
self.result = "\(jsonVar)"
self.performSegue(withIdentifier: "yourSegueIdentifier", sender: nil)
} else {
self.jsonDisplayError.text = "no response"
}
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destViewController : JSONResult = segue.destination as! JSONResult
destViewController.textLabel = self.result
}
}
第二视图控制器:
class SecondViewController: UIViewController {
@IBOutlet var jsonResult: UILabel!
var textLabel = String()
override func viewDidLoad() {
jsonResult.text = textLabel
}
}
您是否在viewwillappaer上设置jsonResult.text时检查它是否正常工作? – ocanal
我不知道如何做到这一点 – Dexstrum
[视图控制器之间传递数据](http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers)可能的重复。它的一些答案是专门针对Swift的。像[this](http://stackoverflow.com/a/31934786/5175709)一个 – Honey