質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

339閲覧

swiftでのデータ引き継ぎの画面遷移

JunZenpou

総合スコア24

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/09/20 07:29

編集2017/09/20 07:52

###前提・実現したいこと
postでjsonデータを次の画面に引き継ぎたいのですが、上手くいきません。

LoginControllerのresultDataに、postで受けっとたJSONデータを格納して、
Userontrollerのparamsにデータを渡して、UserControllerの方にpostで受けっとたJSONデータを表示させたいのですが、
以下のようにコードを作成したのですが、上手くいきません。

LoginViewController.swift

1// LoginViewController.swift 2 3import UIKit 4 5class LoginViewController: UIViewController, UITextFieldDelegate { 6 7 8 @IBOutlet weak var email: UITextField! 9 @IBOutlet weak var password: UITextField! 10 @IBOutlet weak var password_confirmation: UITextField! 11 12 var resultData:String = "" 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 email.delegate = self 17 password.delegate = self 18 password_confirmation.delegate = self 19 } 20 21 func textFieldShouldReturn(_ textField: UITextField) -> Bool{ 22 23 if (textField == email) { 24 25 password?.becomeFirstResponder() 26 27 } else if (textField == password) { 28 29 password_confirmation?.becomeFirstResponder() 30 }else{ 31 // キーボードを閉じる 32 textField.resignFirstResponder() 33 } 34 return true 35 } 36 37 38 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?){ 39 if(email.isFirstResponder || password.isFirstResponder || password_confirmation.isFirstResponder){ 40 email.resignFirstResponder() 41 password.resignFirstResponder() 42 password_confirmation.resignFirstResponder() 43 } 44 } 45 46 47 48 @IBAction func backButton(_ sender: Any) { 49 dismiss(animated: true, completion: nil) 50 } 51 52 53 @IBAction func LoginButton(_ sender: Any) { 54 55 56 let emailText:String = self.email.text! 57 let passwordText:String = self.password.text! 58 let password_confirmationText:String = self.password_confirmation.text! 59 60 let urlString = "" 61 let request = NSMutableURLRequest(url: NSURL(string: urlString)! as URL) 62 63 request.httpMethod = "POST" 64 request.addValue("application/json", forHTTPHeaderField: "Content-Type") 65 66 67 let params: [String: AnyObject] = [ 68 "email": emailText as AnyObject, 69 "password": passwordText as AnyObject, 70 "password_confirmation": password_confirmationText as AnyObject 71 ] 72 73 do{ 74 request.httpBody = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) 75 76 let task:URLSessionDataTask = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {(data,response,error) -> Void in 77 self.resultData = String(data: data!, encoding: .utf8)! 78 print("result:\(self.resultData)") 79 print("response:\(String(describing: response))") 80 81 }) 82 83 task.resume() 84 85 }catch{ 86 87 print("Error:\(error)") 88 return 89 90 } 91 92 } 93 94 95 // MARK: - Navigation 96 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 97 if (segue.identifier == "touserinfo") { 98 let UserViewController = segue.destination as! UserViewController 99 UserViewController.params = self.resultData 100 } 101 } 102 103 104 override func didReceiveMemoryWarning() { 105 super.didReceiveMemoryWarning() 106 } 107 108 109 110 111} 112

UserViewController.swift

1// 2// UserViewController.swift 3 4import UIKit 5 6class UserViewController: UIViewController { 7 8 @IBOutlet weak var label: UILabel! 9 10 var params: String = "" 11 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 label.text = params 16 print("JSON_User_info: \(params)") 17 } 18 19 @IBAction func backButton(_ sender: Any) { 20 dismiss(animated: true, completion: nil) 21 } 22 23 24 override func didReceiveMemoryWarning() { 25 super.didReceiveMemoryWarning() 26 } 27 28 29} 30

ご教授お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1016

2017/09/20 07:47 編集

回答者はエスパーではないので、最低限の情報は書きましょう。どのViewControllerのどの変数をどのViewControllerに渡したいのですか?POSTのJSONを渡す前にまず、単純な画面遷移を実装して、パラメータを渡す実装をしてみてはいかがでしょうか。 無駄な改行が多くてソースも見づらいので、見やすいソースを貼ってください。
JunZenpou

2017/09/20 07:53

追記しました。申し訳ございません。
fuzzball

2017/09/20 08:25 編集

この質問にJSONは関係しているのでしょうか?JSON以外のデータであれば受け渡しが出来ているけど、JSONだとうまくいかないという質問なのでしょうか?
JunZenpou

2017/09/20 08:39 編集

JSON以外は試していないので、このコードのみで行なっています。上記のコードで、受け渡しはできるのですが、ここで、postされた時のjsonのデータだけをusercontrollerに渡すコードを作成したつもりだったのですが、usercontrollerのparams変数が空になってしまい、postされた時のjsonのデータを渡せず、上手くいかない状況です。わかりにくくてすみません。
fuzzball

2017/09/20 08:49

遷移はStoryboard上で行っているのでしょうか?
t_obara

2017/09/20 08:59

基本的な書籍や、関連するキーワードで検索したりしないのでしょうか?
JunZenpou

2017/09/20 09:31

Storyboard上でLoginController側から、idをtouserinfoとして、UserController側に遷移するようにしてます。
fuzzball

2017/09/20 10:06

ボタンを押すと、遷移とLoginButton()の呼び出しが同時に行われているということでいいでしょうか?
JunZenpou

2017/09/20 10:10

そうです。ボタンを押すと、遷移とLoginButton()の呼び出しが行われます。
guest

回答1

0

ベストアンサー

dataTask(with:completionHandler:)は非同期処理なので、実際にデータを受取るまでに時間が掛かります。

データを受け取る前に遷移しているのが今回の質問の原因です。

現在のセグエをマニュアルセグエに変更し、completionHandlerの中からコードで遷移して下さい。

URLSessionでググればサンプルは見つかります。

投稿2017/09/20 10:20

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JunZenpou

2017/09/21 01:52

出来ました!なるほど、データを受け取る前に遷移してたのが原因でしたか。初心者なので、そこらへんがわかりませんでした。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問