APIを使って漢字からひらがなに変換するアプリを作成しています。
APIで取得した文字をViewController.swift内にあるLabelに表示させることはできたのですが、ModalViewController.swiftという別のControllerに値を受け渡したいのですが、表示されません。
ご教授いただけませんでしょうか。
試したこと
ViewController.swiftの中にあるLabelには表示することができました。
表示できない原因の考察
なぜ表示されないのかを自分なりに考えてみました。
- API取得後、デバックエリアには結果がすぐに返ってくるがLabelに反映されるには30秒ほど時間がかかるため
実装できていること
- APIの取得はできている。
- 画面遷移する。
- 値の受け渡しもできる状態である。
下記がViewController.swiftです。
swift
1import UIKit 2 3class ViewController: UIViewController, UITextFieldDelegate { 4 5 @IBOutlet weak var testLabel: UILabel! 6 @IBOutlet weak var textField: UITextField! 7 8 9 var imageView: UIImageView! 10 var backImageView: UIImageView! 11 var hiraganaSentence: String = "" 12 13 14 // レスポンスデータの構造 15 struct PostData: Codable { 16 var app_id : String 17 var request_id : String 18 var sentence : String 19 var output_type : String 20 } 21 22 struct Rubi: Codable { 23 var request_id : String 24 var output_type : String 25 var converted : String 26 } 27 28 override func viewDidLoad() { 29 super.viewDidLoad() 30 31 textField.delegate = self 32 33 } 34 35 override func viewDidAppear(_ animated: Bool) { 36 super.viewDidAppear(animated) 37 38 } 39 40 41 42 @IBAction func hiraganaConvertButton(_ sender: UIButton) { 43 guard let text = textField.text,!text.isEmpty else { 44 print("文章を入力してね") 45 return 46 } 47 48 sentenceChange(text: text) 49 performSegue(withIdentifier: "modal", sender: nil) 50 51 } 52 53 54 // ModalViewに値を渡す 55 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 56 57 let modalVC = segue.destination as! ModalViewController 58 modalVC.result = hiraganaSentence 59 60 } 61 62 // キーボードを閉じる 63 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 64 65 textField.resignFirstResponder() 66 return true 67 68 } 69 70 71 func sentenceChange(text: String) { 72 73 let postData = PostData(app_id: "APIキー",request_id: "record003", sentence: textField.text!, output_type: "hiragana") 74 guard let uploadData = try? JSONEncoder().encode(postData) else { 75 print("失敗しました") 76 return 77 78 } 79 // データの確認 80 print(postData) 81 82 var request = URLRequest(url: URL(string: "https://labs.goo.ne.jp/api/hiragana")!) 83 request.httpMethod = "POST" 84 request.addValue("application/json", forHTTPHeaderField: "Content-Type") 85 let task = URLSession.shared.uploadTask(with: request, from: uploadData, completionHandler: { (data, response, error) in 86 87 // クライアント側エラー 88 if let error = error { 89 print("error:(error)") 90 return 91 } 92 93 guard let data = data, let response = response as? HTTPURLResponse else { 94 print("no data or no response") 95 return 96 } 97 98 if response.statusCode == 200 { 99 guard let jsonData = try? JSONDecoder().decode(Rubi.self, from: data) else { 100 print("json変換に失敗しました") 101 return 102 } 103 print("ここから") 104 print(jsonData.converted) 105 self.testLabel.text = jsonData.converted 106 self.hiraganaSentence = jsonData.converted 107 } else { 108 // レスポンスのステータスコードが200でない場合などはサーバサイドエラー 109 print("サーバエラー ステータスコード: (response.statusCode)\n") 110 } 111 }) 112 task.resume() 113 } 114 115}
Swift
1import UIKit 2 3class ModalViewController: UIViewController { 4 5 @IBOutlet weak var convertText: UITextView! 6 7 var result = "" 8 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5) 14 convertText.text = result 15 print(result) 16 } 17 18 @IBAction func backButton(_ sender: Any) { 19 20 dismiss(animated: true, completion: nil) 21 22 } 23} 24
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/19 10:41
2019/10/19 11:17