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

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

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

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

Q&A

解決済

1回答

506閲覧

2つのテキストフィールドの内容を判定する正誤ロジック

Tomzy

総合スコア104

Swift

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

0グッド

0クリップ

投稿2017/06/29 09:36

問題と解答の2つのテキストフィールドをつくり、問題テキストフィールドには問題をcvsファイルより移入し、回答テキストフィールドにはマイクを使って問題をインプットさせます。両方のテキストフィールドの内容(テキスト)が合っていればイメージの丸を表示し、合っていなけらばXイメージを表示する画面をつくっています。

下記のコーディングで正誤判定をしようとしたのですが、回答ボタンをタップすると回答が合っていてもXイメージが表示されます。どこのロジックが悪いのでしょうか。下記にコードとスクリーンショットを添付しますので教えてください。

// MondaiViewController.swift // Mondai01 // import UIKit class MondaiViewController: UIViewController, UITextFieldDelegate{ //kentei.csvファイルを格納する配列csvArray @IBOutlet weak var mondaiNumberLabel: UILabel! @IBOutlet weak var mondaiField: UITextField! @IBOutlet weak var kaitouField: UITextField! @IBOutlet weak var judgeImageView: UIImageView! @IBOutlet weak var answerBtn: UIButton! //"OnseiTextsCSV"ファイルを格納する配列csvArray var csvArray:[String] = [] //csvArrayから取り出した問題を格納する配列mondaiArray var mondaiArray:[String] = [] var mondaiCount = 0 //問題をカウントする変数 var correctCount = 0 //正解をカウントする変数 let total = 10 //出題数を管理する変数 override func viewDidLoad() { super.viewDidLoad() //問題番号ラベルの表示 let mondaiNumberLabel = UITextField() // サイズ設定 mondaiNumberLabel.frame.size.width = self.view.frame.width * 1/5 mondaiNumberLabel.frame.size.height = 40 // 位置設定 mondaiNumberLabel.center.x = self.view.center.x mondaiNumberLabel.center.y = 100 // 背景色 mondaiNumberLabel.backgroundColor = UIColor(white: 0.9, alpha: 1) // 画面に追加 self.view.addSubview(mondaiNumberLabel) //問題テキストフィールド表示設定 let mondaiField = UITextField() // サイズ設定 mondaiField.frame.size.width = self.view.frame.width * 2 / 3 mondaiField.frame.size.height = 48 // 位置設定 mondaiField.center.x = self.view.center.x mondaiField.center.y = 140 // 背景色 mondaiField.backgroundColor = UIColor(white: 0.9, alpha: 1) // 画面に追加 self.view.addSubview(mondaiField) let viewController = ViewController() //loadCSVメソッドを使用し、csvArrayに検定問題を格納 csvArray = viewController.loadCSV("OnseiTextsCSV") //シャッフルメソッドを使用し、検定問題を並び替えてcsvArrayに格納 //csvArrayの0行目を取り出し、カンマを区切りとしてmondaiArrayに格納 mondaiArray = csvArray[mondaiCount].components(separatedBy: ",") //変数mondaiCountに1を足して、ラベルに出題数を設定 mondaiNumberLabel.text = "第\(mondaiCount+1)問" //TextViewに問題を設定 mondaiField.text = mondaiArray[0] //回答テキストフィールド表示設定 let kaitouField = UITextField() // サイズ設定 kaitouField.frame.size.width = self.view.frame.width * 2 / 3 kaitouField.frame.size.height = 48 // 位置設定 kaitouField.center.x = self.view.center.x kaitouField.center.y = 340 //テキストビューに自動でキーボード表示 kaitouField.becomeFirstResponder() // Delegate を設定 kaitouField.delegate = self // プレースホルダー kaitouField.placeholder = "下のマイクに触って問題を読む" // 背景色 kaitouField.backgroundColor = UIColor(white: 0.9, alpha: 1) // 画面に追加 self.view.addSubview(kaitouField) kaitouField.resignFirstResponder() } //回答ボタンをタップした時の回答正誤の判定と○X表示 @IBAction func btnAction(_ sender: UIButton) { if mondaiField == kaitouField{ //○を表示 judgeImageView.image = UIImage(named: "maru.png") //正解カウントを増やす correctCount += 1 }else{ //間違っていたら×を表示 judgeImageView.image = UIImage(named: "batsu.png") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }

イメージ説明
イメージ説明
イメージ説明

ご参考事項
開発環境は下記のとおりです。
MacBookPro
OS-X10.12.4 Sierra
Xcode 8.3.2 (8E2002)
参照した本は 世界一受けたい iPhoneアプリ開発の授業 Chapter7-2
四択検定アプリを作ろう

私がやりたいことは
スタートボタンを押して第1問が表示されたら(前回の質問でできました)回答欄に音声認識でテキストをインプットして回答ボタンを押したら正誤判定をして丸かバツを表示するというものです。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

mondaiFieldとkaitouFieldの内容...でなく、インスタンスそのものを比較しているためのように見えますね。フィールドの中の文字列同士を比較してみてはいかがでしょう。

投稿2017/06/29 10:26

Bongo

総合スコア10807

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

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

Tomzy

2017/06/29 13:54

ありがとうございました。 if mondaiField == kaitouField{ を if mondaiField.text == kaitouField.text{ に変更しましたら、何をインプットしても丸が表示され、正誤判定をしていません。「フィールドの中の文字列同士を比較」という意味は、上記の修正でよいと了解しますが、いかがでしょうか。すべて丸表示というのは何が原因でしょうか。教えてください。
Bongo

2017/06/29 21:26 編集

mondaiFieldやkaitouFieldなどテキストフィールドをviewDidLoad内で作っていますが、それらはアウトレット(@IBOutlet weak var mondaiField: UITextField!など)に接続されたものとは別のインスタンスです。 ご参考にされた書籍の該当ページがAmazonで読めず詳細が分かりませんでしたが、これですとテキストフィールド類を二重に用意してしまうことになり、少々奇妙な印象を受けます。 現状ですと、回答ボタンを押したときに比較しようとしているのは、viewDidLoadで作ったフィールド同士ではなく、ストーリーボード上にあらかじめ用意したフィールド同士、という状況になっているのかと思います。 「let mondaiNumberLabel = UITextField()」を「mondaiNumberLabel = UITextField()」にし、同じくmondaiFieldとkaitouFieldもletを削除してみるとどうでしょうか。これでviewDidLoad内で新たに作ったフィールドが、ローカル変数ではなくインスタンスのプロパティに代入される形になり、とりあえず動くのではないかと思います。 なお、ストーリーボード上のフィールド類は不要になりますので、のちほど削除してしまってもかまわないでしょう。 [追記] ストーリーボード側のテキストフィールドを使う方針の場合、「let mondaiNumberLabel = UITextField()」、「let mondaiField = UITextField()」、「let kaitouField = UITextField()」の行を削除してみてください。こちらの方が修正箇所が少なくていいかもしれません。
Tomzy

2017/07/02 05:05

Bongo 様 ご指摘ありがとうございました。 どうやらここら辺がまだコーディングの意味が分かっていないところで、今回よくわかりました。 結局、ストーリーボードを残し、コーディングは下記のようにして狙ったとおりの結果を得ました。ありがとうございました。 // MondaiViewController.swift // Mondai01 // // import UIKit class MondaiViewController: UIViewController, UITextFieldDelegate { //kentei.csvファイルを格納する配列csvArray @IBOutlet weak var mondaiNumberLabel: UILabel! @IBOutlet weak var mondaiField: UITextField! @IBOutlet weak var kaitouField: UITextField! @IBOutlet weak var judgeImageView: UIImageView! @IBOutlet weak var answerBtn: UIButton! //"OnseiTextsCSV"ファイルを格納する配列csvArray var csvArray:[String] = [] //csvArrayから取り出した問題を格納する配列mondaiArray var mondaiArray:[String] = [] var mondaiCount = 0 //問題をカウントする変数 var correctCount = 0 //正解をカウントする変数 let total = 10 //出題数を管理する変数 override func viewDidLoad() { super.viewDidLoad() //問題番号ラベルの表示 let mondaiNumberLabel = UITextField() // 画面に追加 self.view.addSubview(mondaiNumberLabel) print ("ここまで来たaaa") // 画面に追加 self.view.addSubview(mondaiField) let viewController = ViewController() //loadCSVメソッドを使用し、csvArrayに検定問題を格納 csvArray = viewController.loadCSV("OnseiTextsCSV") //シャッフルメソッドを使用し、検定問題を並び替えてcsvArrayに格納 //csvArrayの0行目を取り出し、カンマを区切りとしてmondaiArrayに格納 mondaiArray = csvArray[mondaiCount].components(separatedBy: ",") //変数mondaiCountに1を足して、ラベルに出題数を設定 mondaiNumberLabel.text = "第\(mondaiCount+1)問" //TextViewに問題を設定 mondaiField.text = mondaiArray[0] //テキストビューに自動でキーボード表示 kaitouField.becomeFirstResponder() // // Delegate を設定 kaitouField.delegate = self // プレースホルダー kaitouField.placeholder = "下のマイクに触って問題を読む" // 背景色 // kaitouField.backgroundColor = UIColor(white: 0.9, alpha: 1) // } //回答ボタンをタップした時の回答正誤の判定と○X表示 @IBAction func btnAction(_ sender: UIButton) { if mondaiField.text == kaitouField.text { //○を表示 judgeImageView.image = UIImage(named: "maru.png") print ("ここまで来たbbb") //正解カウントを増やす correctCount += 1 }else{ //間違っていたら×を表示 print ("ここまで来たccc") judgeImageView.image = UIImage(named: "batsu.png") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問