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

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

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

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

Q&A

解決済

1回答

296閲覧

swiftでcsvファイルを読み込み第2問を表示する方法(一旦読み込むが1問に戻ってしまう)

Tomzy

総合スコア104

Swift

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

0グッド

0クリップ

投稿2017/07/07 07:17

編集2017/07/08 16:21

> 問題を修正しました。
「世界一受けたい iPhoneアプリ開発の授業 Chapter7-2
四択検定アプリを作ろう」を参考にしてcsvファイルを読み込み第2問を表示するところまでは行ったのですが、第2問は瞬間で消えて第1問に表示が戻ってしまいます。

設問と回答方法が本のサンプルとは異なりますので、流用したコードは一部分のみです。

本のコード(ウェブサイトより最新をダウンロード)と自分のコードを何度も見比べたのですが、どうしても原因が分かりません。

ご教示頂ければ幸いです。コードとスクリーンショットは下記のとおりです。
最初に質問した時は次のステップ分まで入っていました。そこで、「編集」でその部分を修正しました。

私のコード

MondaiViewController.swift

1// Mondai01 2// 3 4import UIKit 5 6 class MondaiViewController: UIViewController, UITextFieldDelegate { 7 8 //音声問題.csvファイルを格納する配列csvArray 9 @IBOutlet weak var mondaiNumberLabel: UILabel! 10 @IBOutlet weak var mondaiField: UITextField! 11 @IBOutlet weak var kaitouField: UITextField! 12 @IBOutlet weak var judgeImageView: UIImageView! 13 @IBOutlet weak var answerBtn: UIButton! 14 15 //"OnseiTextsCSV"ファイルを格納する配列csvArray 16 var csvArray:[String] = [] 17 //csvArrayから取り出した問題を格納する配列mondaiArray 18 var mondaiArray:[String] = [] 19 20 var mondaiCount = 0 //問題をカウントする変数 21 var correctCount = 0 //正解をカウントする変数 22 // let total = 10 //出題数を管理する変数 23 var nextBtn = UIButton() 24 25 override func viewDidLoad() { 26 super.viewDidLoad() 27 28 print ("ここまで来たaaa") 29 30 let viewController = ViewController() 31 32 //loadCSVメソッドを使用し、csvArrayに検定問題を格納 33 csvArray = viewController.loadCSV("OnseiTextsCSV") 34 35 36 //csvArrayの0行目を取り出し、カンマを区切りとしてmondaiArrayに格納 37 mondaiArray = csvArray[mondaiCount].components(separatedBy: ",") 38 39 //変数mondaiCountに1を足して、ラベルに出題数を設定 40 mondaiNumberLabel.text = "第\(mondaiCount+1)問" 41 //TextViewに問題を設定 42 mondaiField.text = mondaiArray[0] 43 44 45 //テキストビューに自動でキーボード表示 46 kaitouField.becomeFirstResponder() 47 48 // Delegate を設定 49 kaitouField.delegate = self 50 51 // プレースホルダー 52 kaitouField.placeholder = "マイクで問題を読む" 53 54 } 55 56//回答ボタンをタップした時の回答正誤の判定と○X表示 57 58 @IBAction func btnAction(_ sender: UIButton) { 59 60 print ("ここまで来たaaa222") 61 if mondaiField.text == kaitouField.text { 62 63 //○を表示 64 judgeImageView.image = UIImage(named: "maru.png") 65 print ("ここまで来たbbb") 66 //回答ボタンの使用停止 67 answerBtn.isEnabled = false 68 69 //正解カウントを増やす 70 correctCount += 1 71 }else{ 72 //間違っていたら×を表示 73 print ("ここまで来たccc") 74 judgeImageView.image = UIImage(named: "batsu.png") 75 76 //回答ボタンの使用停止 77 answerBtn.isEnabled = false 78 } 79 } 80 81 func btn02Action(_ sender: UIButton) { 82 83 84 func nextQuestion(){ 85 86 //問題カウント変数をカウントアップ 87 mondaiCount += 1 88 //mondaiArrayに格納されている問題配列を削除 89 mondaiArray.removeAll() 90 //csvArrayから次の問題配列をmondaiArrayに格納 91 mondaiArray = csvArray[mondaiCount+1].components(separatedBy: ",") 92 93 //問題数ラベル、問題表示TextView、選択肢ボタンに文字をセット 94 mondaiNumberLabel.text = "第\(mondaiCount+1)問" 95 mondaiField.text = mondaiArray[0] 96 97 print ("ここまで来たddd") 98 99//// 前回の質問に入っていた次のステップに進むためのif文ですので、CommentOutしました。 100 101 //if-else文を追加。mondaiCountがtotalに達したら画面遷移 102// if mondaiCount == total { 103// 104// //Stroyboard SegueのIdentifierを引数に設定して画面遷移 105// performSegue(withIdentifier: "score", sender: nil) 106 107// } 108// 109 110 //else{ 111 112 print ("ここまで来たeee") 113 } 114 115 //正誤表示画像を隠す 116 judgeImageView.isHidden = true 117 //nextQuestionメソッドを呼び出す 118 nextQuestion() 119 120 print ("ここまで来たfff") 121 122 } 123 124 override func didReceiveMemoryWarning() { 125 super.didReceiveMemoryWarning() 126 // Dispose of any resources that can be recreated. 127 } 128}

イメージ説明

ご参考事項

  1. 茶色のもどる ボタンは本のImageを使ったのでもどるになっていますが本来なら次のボタンです。func btn02Actionと結んでいます。

  2. 一度answerBtnを押し、次に戻るボタン、すなわちbtn02Actionを押した場合の現象は一瞬第2問の数字と問題が現れたあと消えて第1問と問題が現れます。一旦現れた判定の×マークは消えます、その時のprintの結果は下記のとおりです。

ここまで来た01
ここまで来た02
ここまで来た01
ここまで来たaaa
ここまで来た02
ここまで来た01
2017-07-09 00:56:10.916377+0900 Mondai01[79881:34645706] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /Users/tomijisuzuki/Library/Developer/CoreSimulator/Devices/ systemgroup.com.apple.configurationprofiles
2017-07-09 00:56:10.916690+0900 Mondai01[79881:34645706] [MC] Reading from private effective user settings.
ここまで来たaaa222
ここまで来たccc
ここまで来たddd
ここまで来たeee
ここまで来たfff
ここまで来たaaa
ここまで来た02
ここまで来た01

3.もどるボタンを何度押しても一旦第2問が表示され、すぐに1問にもどります。

4.一旦 ここまで来たfff には到達するのですが、何故か元に戻りここまで来たaaa をプリントする原因を承知したいと思います。それがこの質問の主旨です。

5.開発環境は下記のとおりです。
MacBookPro
OS-X10.12.4 Sierra
Xcode 8.3.2 (8E2002)

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

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

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

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

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

fuzzball

2017/07/07 08:04

「ここまで来たeee」の前の行は「ここまで来たddd」でしょうか?「ここまで来た01」と「ここまで来た02」はどこにあるのでしょうか?
Tomzy

2017/07/07 08:13

fuzzballさんへ 早速レスポンスありがとうございました。説明不足でごめんなさい。「ここまで来た01」と「ここまで来た02」は第1画面とつながっているViewControllerに書いてあるprintで第1画面より第2画への遷移時に通過します。 //if-else文を追加。mondaiCountがtotalに達したら画面遷移 if mondaiCount < total{ //csvArrayから次の問題配列をmondaiArrayに格納 mondaiArray = csvArray[mondaiCount].components(separatedBy: ",") //問題数ラベル、問題表示TextView、選択肢ボタンに文字をセット mondaiNumberLabel.text = "第\(mondaiCount+1)問" mondaiField.text = mondaiArray[0] print ("ここまで来たddd") }else{ // //Stroyboard SegueのIdentifierを引数に設定して画面遷移 performSegue(withIdentifier: "score", sender: nil) } print ("ここまで来たeee") } @IBAction func btn02Action(_ sender: UIButton) {
fuzzball

2017/07/07 08:18

「ここまで来たddd」は出力されておらず、performSegue(withIdentifier: "score", sender: nil)が実行されているということでしょうか?
Tomzy

2017/07/07 08:19

「ここまで来たeee」の前の行と「ここまで来たddd」の間には上記のとおり   }else{ // //Stroyboard SegueのIdentifierを引数に設定して画面遷移 performSegue(withIdentifier: "score", sender: nil) } }else{ // //Stroyboard SegueのIdentifierを引数に設定して画面遷移 performSegue(withIdentifier: "score", sender: nil) }があります
fuzzball

2017/07/07 08:23

「前の行」というのはログでの話です。コードの話ではありません。
Tomzy

2017/07/07 08:24

「ここまで来たddd」は回答を10回行うと到達するif文ですので、そこまでは行っていませんが、何故かperformSegue(withIdentifier: "score", sender: nil)が実行されているようです。しかし、画面遷移はしません。
Tomzy

2017/07/07 08:27

質問した時は画面遷移のidentifierを設定していませんでしたが、現在は設定したため、第3画面に遷移します
Tomzy

2017/07/07 08:29

戻るボタン(nextButton)を押すと直ちに第3画面に遷移します。従って質問時に書いた  もどるボタンを何度押しても一旦第2問が表示され、すぐに1問にもどります。」は間違いです。
fuzzball

2017/07/07 08:31

if mondaiCount < total { ですから、"ここまで来たddd"は10回に「到達していない」ときに通るコードではないですか?
Tomzy

2017/07/07 09:44 編集

そうです。ここら辺がおかしいのですね。チェックしてみます。ありがとうございました。
Tomzy

2017/07/07 08:42

途中でいろいろいじっている間に回答数を9に修正していました。0に戻したら質問をしたときの状態に戻りました。混乱させてごめんなさい。一旦この質問は取り下げます。
guest

回答1

0

自己解決

ストーリーボード上で
func btn02Action(_ sender: UIButton) {
ボタンが第3画面への遷移するアクションとして残っていたため、そのコンフリクトで誤表示されていることがわかりました。

そのアクションを消去したらコードどおり第2問以下が表示されるようになりました。

ストーリーボードでの指令とコードによる指令の重複設定などを充分チェックする必要がある事が反省点です。

投稿2017/07/15 07:51

Tomzy

総合スコア104

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問