2017-02-18 93 views
0

我试图将数据从一个控制器传递到下一个控制器。该代码是如下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 
} 

结果被输出到控制台正确,但它不是在对标签显示第二视图控制器页面。

+0

您是否在viewwillappaer上设置jsonResult.text时检查它是否正常工作? – ocanal

+0

我不知道如何做到这一点 – Dexstrum

+0

[视图控制器之间传递数据](http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers)可能的重复。它的一些答案是专门针对Swift的。像[this](http://stackoverflow.com/a/31934786/5175709)一个 – Honey

回答

1

我认为这个问题是在异步回调发送数据时,你已经在这里两个选项,

首个解决方案

参数传递给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 
    } 
} 
+0

如何更改代码以仅在发送响应时发送数据?换句话说,如果没有响应,我该如何阻止它进入新的视图控制器?我试过了,虽然它在第一个屏幕上很快显示没有响应,但它会转到下一个视图控制器并不显示任何内容 – Dexstrum

+0

您第一次还是第二次使用哪个解决方案? – ocanal

+0

我正在研究第二种解决方案。 – Dexstrum

相关问题