2017-02-18 127 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

相關問題