2017-02-18 8 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" 
     } 
    } 
} 

第2のビューコントローラ:

@IBOutlet var jsonResult: UILabel! 

var textLabel = String() 

override func viewDidLoad() { 
    jsonResult.text = textLabel 
} 

結果が正しくコンソールに印刷されているが、それは上のラベルに表示されません2番目のビューコントローラページ。

+0

viewwillappaerでjsonResult.textを設定しても機能しているかどうかチェックしましたか? – ocanal

+0

どうすればよいか分かりません – Dexstrum

+0

[View Controller間でデータを受け渡しする]可能な複製(http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers)。その答えの中には、特にSwiftのものがあります。 [これ](http://stackoverflow.com/a/31934786/5175709)one – 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" 
      } 
     } 
    } 
} 

第二の溶液

あなたの非同期コールバックが完了したときに、手動で

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 
    } 
} 
を(ボタンなどをクリックしていない)2つのViewControllerの間sequeを作成し、 performSegue

第2ビューコントローラ:

class SecondViewController: UIViewController { 
    @IBOutlet var jsonResult: UILabel! 

    var textLabel = String() 

    override func viewDidLoad() { 
     jsonResult.text = textLabel 
    } 
} 
+0

応答がある場合にのみ、データを送信するようにコードを変更する方法はありますか?言い換えれば、応答がない場合、新しいView Controllerに移動するのを止めるにはどうしたらいいですか?私はそれをテストしようとしましたが、最初の画面に応答がすぐに表示されないうちに、次のView Controllerに行き、何も表示しません。 – Dexstrum

+0

どちらの解決法を最初にやっていますか? – ocanal

+0

私は第2の解決策に取り組んでいます。 – Dexstrum

関連する問題