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

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

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

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

button

HTMLで用いる<button>タグです。

Swift

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

Q&A

解決済

1回答

1356閲覧

複数のボタンを押すたびにそれぞれon,offに切り替える方法

pepper0

総合スコア20

JSON

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

button

HTMLで用いる<button>タグです。

Swift

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

0グッド

0クリップ

投稿2018/11/28 10:36

プロジェクトに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}

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

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

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

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

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

guest

回答1

0

ベストアンサー

まあまあややこしいけど、僕がやるならこう。

swift

1enum State { 2 case on, off 3 4 mutating func toggle() { 5 6 switch self { 7 case .on: self = .off 8 case .off: self = .on 9 } 10 } 11} 12 13struct StatedText { 14 private var state: State 15 private let onText: String 16 private let offText: String 17 18 init(onText: String, offText: String) { 19 20 self.state = .on 21 self.onText = onText 22 self.offText = offText 23 } 24 25 mutating func toggle() { 26 27 state.toggle() 28 } 29 30 var text: String { 31 32 switch state { 33 case .on: return onText 34 case .off: return offText 35 } 36 } 37} 38 39class StatedButton { 40 private var statedText: StatedText 41 let button: UIButton 42 43 func toggle() { 44 45 statedText.toggle() 46// button.text = statedText.text 47 button.setTitle(statedText.text,for: UIControlState.normal) 48 } 49 50 init(button: UIButton, onText: String, offText: String) { 51 52 self.button= button 53 self.statedText = StatedText(onText: onText, offText: offText) 54 } 55}

swift

1class ViewController: UIViewController , UIScrollViewDelegate , UITextFieldDelegate { 2 ... 3 ... 4 var buttons: [StatedButton] = [] 5 6 .... 7 .... 8 9 10 override func viewDidLoad() { 11 ... 12 ... 13 buttons = sam1.sam1.map { sample in 14 let button = UIButton() 15 ... 16 ... 17 18 return StatedButton(button: button, onText: "オンの時のテキスト", offText: "オフの時のテキスト") 19 } 20 21 ... 22 ... 23 24 } 25 26 ... 27 ... 28 29 @objc func buttonTapped(_ sender: UIButton) { 30 31 buttons 32 .filter { statedButton in sender == statedButton.button } 33 .first 34 .map { statedButton in statedButton.toggle() } 35 } 36 37 ... 38 ... 39}

投稿2018/11/28 12:50

編集2018/12/03 06:58
MasakiHori

総合スコア3384

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

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

pepper0

2018/11/29 06:01

回答ありがとうございます。 改善していただいたコードを実行しました。 結果として特に変化がありませんでした。 初めて見る文法が多くあり、まだ完全に理解できていないため私が何か間違えたかもしれません。 内容としては、最終的にclass StatedLabelのラベルに実行結果が反映されるということですか?
MasakiHori

2018/11/29 06:52

UILabelとUIButtonを間違えてました。コード修正しました
pepper0

2018/11/29 09:36

修正ありがとうございます。 再び質問なのですが、class StatedButton の button.text = statedText.text の部分のエラーだけが直せないです。何回も申し訳ないですが、よければご教授願えますか?
MasakiHori

2018/12/03 06:59

遅くなりました。修正時に見落としがありました。新たに修正しました。
pepper0

2018/12/11 06:25

返信遅れました。 自力で修正することは出来ましたが、再度修正していただきありがとうございました。 とても参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問