2017-02-18 6 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에 대한 답변입니다. like [this] (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" 
      } 
     } 
    } 
} 

두 번째 솔루션

두의 ViewController 사이 seque 만들기 (안 버튼 등을 클릭), 및 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

관련 문제