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

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

ただいまの
回答率

90.37%

  • Swift

    9181questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 473

Tomzy

score 94

問題と解答の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問が表示されたら(前回の質問でできました)回答欄に音声認識でテキストをインプットして回答ボタンを押したら正誤判定をして丸かバツを表示するというものです。

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/29 22:54

    ありがとうございました。
    if mondaiField == kaitouField{

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

    キャンセル

  • 2017/06/30 05:58 編集

    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()」の行を削除してみてください。こちらの方が修正箇所が少なくていいかもしれません。

    キャンセル

  • 2017/07/02 14: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()
    }

    }

    キャンセル

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

  • ただいまの回答率 90.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Swift

    9181questions

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