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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

480閲覧

SWIFTでViewController間での値渡しについて

KKK_

総合スコア29

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2017/09/11 08:24

ViewController1に配置したButtonからViewController2へ遷移し
TableViewCellへ値を渡したいのですが、Buttonのタップ時に
PHP経由でサーバーから受け取ったJSONデータをパースして
変数(jDataList)に格納後、格納したものをViewController2に渡したいです。

Buttonのタップイベントの中にデータ取得処理を記載し、
ButtonからViewControllere2へセグエを作成し下記の様に実装しましたが
データ取得よりも先に下記のprepareの方が先に処理されてしまい値を渡すことができません。

ソースで画面遷移するパターンなど色々試しましたが解決策がわかりません。
ViewControllerのIdentiferの設定やStoryBordでのセグエの設定が必要かもよくわからないため詳細に教えていただければ幸いです。

*画面遷移時の処理

SWIFT

1override func prepare(for segue: UIStoryboardSegue, sender: Any!) { 2 if segue.identifier == "toViewControllerSegue" { //ThirdViewControllerに遷移する場合 3 4 //View Controllerへ値を渡す 5 let VC = segue.destination as! ViewController2 6 VC.jDataList = self.json 7 print(json) 8 } 9 }

*データ取得処理

SWIFT

1 let urlStr = "http://192.168.xxx.xxx/testpage/jsontest.php" 2 let encodedURL = urlStr.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed) 3 4 if let url = URL(string: encodedURL!) { 5 let req = NSMutableURLRequest(url: url) 6 req.httpMethod = "POST" 7 8 let task = URLSession.shared.dataTask(with: req as URLRequest, completionHandler: { (data, resp, err) in 9 print(resp!.url!) 10 print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue) as Any) 11 12 // 受け取ったdataをJSONパース、エラーならcatchへジャンプ 13 do { 14 // dataをJSONパースし、グローバル変数"getJson"に格納 15 self.json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary 16 17 18 //ストーリーボードのインスタンスを作成 19 let storyboard: UIStoryboard = self.storyboard! 20 //検索結果画面のビューのインスタンスを作成 21 let nextView = storyboard.instantiateViewController(withIdentifier: "toViewController") as! ViewController 22 //画面遷移を実行 23 self.present(nextView, animated: true, completion: nil) 24 } catch { 25 print (error) 26 return 27 } 28 }) 29 task.resume() 30 31 }

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

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

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

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

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

Stripe

2017/09/12 01:55

Buttonタップしたときに、データを取得しなければならないんですか? 画面遷移してからデータを取得してもいいのでは?
Stripe

2017/09/12 01:58

データ取得処理の中に、画面遷移のコードが書かれていますが、buttonタップ時の画面遷移とはこれのことですか?
guest

回答1

0

ベストアンサー

  • ViewController1とViewController2はマニュアルセグエで繋ぐ。
  • ボタンを押したらデータ取得処理を走らせる。
  • データ取得が完了したらマニュアルセグエを発動させる。

セグエ発動にはperformSegue(withIdentifier:sender:)を使って下さい。

投稿2017/09/11 08:30

fuzzball

総合スコア16731

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

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

KKK_

2017/09/11 09:23

早速のご回答ありがとうございます。 お恥ずかしいですがマニュアルセグエとはどの様に実装するのでしょうか?
KKK_

2017/09/11 09:29

StoryBordIDを設定するだけで良いのでしょうか? IDを設定しperformSegueを行うと下記のエラーになってしまいます。 'NSInternalInconsistencyException', reason: 'Could not perform segue with identifier 'toView'. A segue must either have a performHandler or it must override -perform.' *** First throw call stack: ( 0 CoreFoundation 0x00000001081abb0b __exceptionPreprocess + 171 1 libobjc.A.dylib 0x0000000107c10141 objc_exception_throw + 48 2 UIKit 0x0000000108dabf45 -[UIStoryboardSegue _prepare] + 0 3 UIKit 0x0000000108d97444 -[UIStoryboardSegueTemplate _performWithDestinationViewController:sender:] + 447 4 UIKit 0x0000000108d97254 -[UIStoryboardSegueTemplate _perform:] + 82 5 UIKit 0x0000000108d97517 -[UIStoryboardSegueTemplate perform:] + 157 6 UIKit 0x00000001085d0d82 -[UIApplication sendAction:to:from:forEvent:] + 83 7 UIKit 0x00000001087555ac -[UIControl sendAction:to:forEvent:] + 67 8 UIKit 0x00000001087558c7 -[UIControl _sendActionsForEvents:withEvent:] + 450 9 UIKit 0x0000000108754802 -[UIControl touchesEnded:withEvent:] + 618 10 UIKit 0x0000000108afa1f9 _UIGestureEnvironmentSortAndSendDelayedTouches + 5553 11 UIKit 0x0000000108af5210 _UIGestureEnvironmentUpdate + 1409 12 UIKit 0x0000000108af4c43 -[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 484 13 UIKit 0x0000000108af3e0a -[UIGestureEnvironment _updateGesturesForEvent:window:] + 274 14 UIKit 0x000000010863feea -[UIWindow sendEvent:] + 4092 15 UIKit 0x00000001085eca84 -[UIApplication sendEvent:] + 352 16 UIKit 0x0000000108dd05d4 __dispatchPreprocessedEventFromEventQueue + 2926 17 UIKit 0x0000000108dc8532 __handleEventQueue + 1122 18 CoreFoundation 0x0000000108151c01 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 19 CoreFoundation 0x00000001081370cf __CFRunLoopDoSources0 + 527 20 CoreFoundation 0x00000001081365ff __CFRunLoopRun + 911 21 CoreFoundation 0x0000000108136016 CFRunLoopRunSpecific + 406 22 GraphicsServices 0x000000010c875a24 GSEventRunModal + 62 23 UIKit 0x00000001085cf134 UIApplicationMain + 159 24 tableview_sample 0x0000000107622447 main + 55 25 libdyld.dylib 0x000000010b90a65d start + 1 26 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException
fuzzball

2017/09/11 09:48

>>マニュアルセグエとはどの様に実装するのでしょうか とりあえずググってみてはどうでしょうか?
KKK_

2017/09/11 10:12

土日でずっと調べているのですがわからない状態です。 ソースでセグエを実装できないかどうかも含めてググって見ましたがたどり着きません。 ”マニュアルセグエ”に一致するものが見つかりませんでした。 カスタムセグエでも探しましたがそれも違いますよね。。。 StoryBord上ではD&Dして繋げるということはしなくて良いということでしょうか? 遷移先のperformSegue(withIdentifier:sender:)のIdentiferは遷移先ViewControllerのStoryBordIDという認識ですが間違っていないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問