プロジェクトにjsonファイルを組み込み、そのファイル内のプロパティの値をforEachで回し、値の数だけボタンを作りました。そこに、ボタンそれぞれにボタンを押すたびにボタンテキストを切り替えたいと考えています。
ボタンアクションがそもそも間違っているのは分かります。
何か良い方法はあるでしょうか?
下記に作成段階のコードとjsonファイルを記しました。
swift
1import UIKit 2//jsonの使用 3import Foundation 4//話させる 5import AVFoundation 6 7class ViewController: UIViewController , UIScrollViewDelegate , UITextFieldDelegate { 8 9 var num:Int = 170 10 var wid:CGFloat = 0 11 var size:Int = 0 12 var talker = AVSpeechSynthesizer() 13 var count = 0 14 15 16 struct Sample: Codable { 17 18 let sam1: [String] 19 let sam2: [String] 20 // let sam3: [String] 21 } 22 23 24 //オブジェクトのデータをjson文字列として返している 25 func getJSONData() throws -> Data? { 26 guard let path = Bundle.main.path(forResource: "sample", ofType: "json") else { return nil } 27 28 let url = URL(fileURLWithPath: path) 29 30 return try Data(contentsOf: url) 31 32 } 33 34 override func viewDidLoad() { 35 super.viewDidLoad() 36 37 if UIDevice.current.userInterfaceIdiom == .phone { 38 39 //画面のスクロール 40 let scrollView = UIScrollView() 41 scrollView.backgroundColor = UIColor.white 42 scrollView.frame.size = CGSize(width: view.frame.width, height: view.frame.height) 43 scrollView.center = self.view.center 44 scrollView.contentSize = CGSize(width: view.frame.width, height: 1000) 45 scrollView.bounces = false 46 scrollView.indicatorStyle = .default 47 scrollView.scrollIndicatorInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) 48 scrollView.delegate = self 49 50 self.view.addSubview(scrollView) 51 52 53 //画面上部のラベル 54 guard let data1 = try? getJSONData() else { return } 55 56 guard let sam1 = try? JSONDecoder().decode(Sample.self, from: data1!) else { return } 57 58 sam1.sam1.forEach({(sample) in 59 let label = UILabel() 60 label.textAlignment = NSTextAlignment.center 61 label.text = "(sample)" 62 label.frame = CGRect(x: 150, y: 150, width: 300, height: 30) 63 label.layer.position = CGPoint(x: self.view.frame.width/2, y:100) 64 label.textColor = UIColor.black 65 label.backgroundColor = UIColor(red: 0.3, green: 0.4, blue: 0.7, alpha: 0.1) 66 scrollView.addSubview(label) 67 68 //話させる 69 let utterance = AVSpeechUtterance(string:sample) 70 utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP") 71 self.talker.speak(utterance) 72 73 }) 74 75 76 guard let data2 = try? getJSONData() else { return } 77 78 guard let sam2 = try? JSONDecoder().decode(Sample.self, from: data2!) else { return } 79 80 81 //jsonデータ出力、ボタンの生成 82 sam2.sam2.forEach({(sample) in 83 84 let button = UIButton() 85 button.frame = CGRect(x: 25+(size*60)+(size*10), y: 370, width: 300, height: 60) 86 button.layer.position = CGPoint(x:self.view.frame.width/2,y:170 + wid) 87 button.setTitleColor(UIColor.black, for: UIControlState.normal) 88 button.backgroundColor = UIColor(red: 0.3, green: 0.7, blue: 0.6, alpha: 0.1) 89 button.layer.borderColor = UIColor(red: 0.3, green: 0.6, blue: 0.5, alpha: 1).cgColor 90 button.layer.cornerRadius = 15 91 button.layer.shadowOffset = CGSize(width: 2,height: 2) 92 button.setTitle("(sample)",for: UIControlState.normal) 93 94 //ボタンで実行するメソッド 95 button.addTarget(self, action: #selector(buttonTapped(_:)), for: UIControlEvents.touchUpInside) 96 97 /* 98 button.setTitle("(sample)☑️",for: UIControlState.highlighted) 99 button.setTitleColor(UIColor.red, for: UIControlState.selected) 100 */ 101 102 scrollView.addSubview(button) 103 104 wid = wid + 70 105 106 size = size+1 107 // i=i+1 108 109 }) 110 111 112 //テキストフィールドの生成 113 var textField :UITextField! 114 textField = UITextField() 115 textField.delegate = self 116 textField.frame = CGRect(x: self.view.frame.width/5 , y: 170 + wid, width: 250 , height: 60) 117 textField.placeholder = "その他" 118 textField.borderStyle = UITextBorderStyle.roundedRect 119 textField.textAlignment = NSTextAlignment.left 120 textField.keyboardType = UIKeyboardType.default 121 textField.returnKeyType = UIReturnKeyType.go 122 textField.clearButtonMode = UITextFieldViewMode.never 123 scrollView.addSubview(textField) 124 125 wid = wid + 200 126 127 //送信ボタン 128 let sentButton :UIButton! 129 sentButton = UIButton(type: .custom) 130 sentButton.frame = CGRect(x: self.view.frame.width/5 , y: 170 + wid, width: 100 , height: 45) 131 sentButton.layer.position = CGPoint(x:self.view.frame.width/2,y:170 + wid) 132 sentButton.setTitle("送信",for: UIControlState.normal) 133 sentButton.backgroundColor = UIColor(red: 0.5, green: 0.6, blue: 0.7, alpha: 0.2) 134 sentButton.setTitleColor(.black, for: .normal) 135 sentButton.layer.shadowOffset = CGSize(width: 2,height: 2) 136 sentButton.layer.cornerRadius = 13 137 scrollView.addSubview(sentButton) 138 } 139 140 if UIDevice.current.userInterfaceIdiom == .pad{ 141 142 } 143 } 144 145 //ボタンアクション 146 **この部分が問題です** 147 @objc func buttonTapped(_ sender: AnyObject){ 148 print("ボタンの情報:(sender)") 149 150 count += 1 151 if(count%2 == 0){ 152 button.text = "(sample)☑️" 153 } 154 else{ 155 button.text = "(sample)☑️" 156 157 } 158 } 159 160 override func didReceiveMemoryWarning() { 161 super.didReceiveMemoryWarning() 162 } 163 164 //キーボードを下げる 165 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 166 textField.resignFirstResponder() 167 return true 168 169 } 170}
json
1{ 2//sam2をforEachで回してボタンを作っています 3 "sam1" : ["どんな症状ですか?"], 4 "sam2" : ["エラーが出ています","プログラムが動きません","実行できません"] 5}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/29 06:01
2018/11/29 06:52
2018/11/29 09:36
2018/12/03 06:59
2018/12/11 06:25