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

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

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

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

Q&A

解決済

2回答

1034閲覧

クイズアプリ 合計点表示

yamadayeah90

総合スコア6

Swift

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

0グッド

0クリップ

投稿2020/07/13 11:46

編集2020/07/14 02:15

クイズのアプリで,正解のボタンを押すと答えが溜まっていき,最後の最後の画面で合計点を表示したいです

上記のシステムを本を読んだりして,作ってみたのですが,エラーなどは出ないのですが,どの回答を選択しても,合計点が0になってしまいます.

読んだ本は「絶対に挫折しないiPhoneアプ開発超入門」という本です。
https://www.youtube.com/watch?v=Y5o8ZKGNWIA&t=403s
こちらの動画を参考にして開発しました。
しかし、独学なので自分の作りたいアプリを考えて作ってみたところ今回のような形になってしまいました。

発生している問題・エラーメッセージ

swift

1コードimport UIKit 2 3class Question1ViewController: UIViewController { 4 5 var score1 = 0 6 @IBAction func q11(){ 7 score1 += 0 8 } 9 @IBAction func q12(){ 10 score1 += 0 11 } 12 @IBAction func q13(){ 13 score1 += 1 14 } 15 @IBAction func q14(){ 16 score1 += 0 17 } 18 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 23 24 25 // Do any additional setup after loading the view. 26 func prepareForSegue(segue: UIStoryboardSegue, sender:AnyObject?){ 27 var aD: AppDelegate = UIApplication.shared.delegate as! 28 AppDelegate 29 30 aD.score += score1 31 } 32 } 33

この画面で正解のボタンに,変数に対して1を加え,それを10個のViewControllerで繰り返して

swift

1コードimport UIKit 2 3class ResultViewController: UIViewController { 4 @IBOutlet var scoreLavel: UILabel! 5 @IBOutlet var massageLavel:UILabel! 6 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 // Do any additional setup after loading the view. 12 let aD:AppDelegate = UIApplication.shared.delegate as! AppDelegate 13 var scores:Int = aD.score * 10000000 14 scoreLavel.text = "(scores)だ!!" 15 16 if scores < 10000000{ 17 massageLavel.text = "あなたは道化のバギーレベルです" 18 }else if scores < 50000000{ 19 massageLavel.text = "あなたはナミです" 20 }else if scores < 100000000{ 21 massageLavel.text = "あなたはルフィーレベルです" 22 } 23 aD.score = 0; 24 aD.records.append(aD.score as AnyObject) 25 26 } 27 28 29 /* 30 // MARK: - Navigation 31 32 // In a storyboard-based application, you will often want to do a little preparation before navigation 33 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 34 // Get the new view controller using segue.destination. 35 // Pass the selected object to the new view controller. 36 } 37 */ 38 39} 40

この画面で,合計得点と,得点の過多によってラベルの表記を変えるようにしたいのですが.どのようにしたらいいのでしょうか?

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

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

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

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

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

TsukubaDepot

2020/07/14 04:17 編集

> 上記のシステムを本を読んだりして,作ってみたのですが,エラーなどは出ないのですが,どの回答を選択しても,合計点が0になってしまいます. どのような本を参考にして作られたのでしょうか。私の手元にない可能性もありますが、参考にされた書籍を例示された方がいいかもしれません。 また、関数の書き方や UIApplication.shared.delegate が出てくるあたりが一般的でなく感じるのですが、これもどこかに記載されていた方法でしょうか。 また、コードについてはスクリーンショットではなく、このコメントでなくコメント本文に追記していだければと思います。 コードを貼り付けた後、そのコードをドラッグして、質問画面の<CODE>ボタンを押すことで、整形されたコードを表示することが可能ですので、ぜひご協力ください。
fuzzball

2020/07/14 01:12

・「合計点が0になってしまいます」というのは、どこでどうやって確認しましたか? ・TsukubaDepotさんも書かれていますが、コードはテキストで書いて下さい。
snowdropAPP

2020/07/14 02:25 編集

スイフトについてあまりわかりませんがブレークポイントを張ってどの場所で点数がゼロになっているのか調べたほうがいいかと思います
guest

回答2

0

ベストアンサー

動かない理由なのですが

  • prepareForSegue(segue:sender:)を定義する位置を間違っている
  • そもそも、prepareForSegue(segue:sender:)というメソッドが古すぎて使えない

の2つかと思います。

Youtubeで参考にされている動画ですが、前提とする環境が Xcode6.3/Swift1.2 と古すぎます。動画の説明書き(動画の下に書かれているテキストでの説明)に書いてありました。

質問者の yamadayeah90 さんの環境は分かりませんが、最新は Swift5 なので、Swift1.2ということはまずないかと思います(動画に合わせてわざわざ古い環境を構築したのであれば別ですが)。

コマ送りで動画を見た感想なのですが、Swift1.2 というのはさておき、配列のクラス名を無闇に Any にするあたりからあまりにも酷い内容なので、是非 Swift5 対応の教材で、かつ内容が信頼できる教材をお使いになることをお勧めします。

それはさておき、1つ目については、

Swift

1override func viewDidLoad() { 2 super.viewDidLoad() 3 4 func prepareForSegue(segue: UIStoryboardSegue, sender:AnyObject?){ 5 var aD: AppDelegate = UIApplication.shared.delegate as! 6 // 中略 7 } 8 }

となっていますが、ここが間違っています。今回の目的では、関数の中に関数を記述する必要はありません。

(一応、関数内で関数を定義する「カリー化」というのがあるのでコンパイルエラーにはならないようです。カリー化については私は知識が及んでいないので、どなたか補足されることを願っています)。

したがって、

Swift

1 override func viewDidLoad() { 2 super.viewDidLoad() 3 } 4 5 func prepareForSegue(segue: UIStoryboardSegue, sender:AnyObject?){ 6 // 中略 7 }

という具合に記述する必要があります(おそらく、動画もそのようになっているはずです)。

しかし、前述の通りprepareForSegue(segue:sender:)というメソッド(関数)は古くて記述しても動作しないようです(理由までは追求していません)。

対応する新しいメソッドはprepare(for:sender:)なので、これに置き換える必要があります。

つまり、

Swift

1 override func viewDidLoad() { 2 super.viewDidLoad() 3 } 4 5 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 6 var aD: AppDelegate = UIApplication.shared.delegate as! 7 AppDelegate 8 9 aD.score += score1 10 }

と記述する必要があります。

投稿2020/07/14 09:20

TsukubaDepot

総合スコア5086

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

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

yamadayeah90

2020/07/14 14:52

ありがとうございました。無事に作動して、合計点もまちがなく表示されました。
guest

0

swift

1aD.score = 0 2aD.records.append(aD.score as AnyObject)

0にした後で追加しているからでは?

投稿2020/07/14 01:09

fuzzball

総合スコア16731

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

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

TsukubaDepot

2020/07/14 09:23

実は動画がそのようになっているみたいです(17分あたり)。オリジナルは [Any]の配列に String や Int をねじ込んでいるのですが、そのうち質問者さんは Int だけを使っているのだと思います(なので、 AnyObject にキャストしていると思われます)。 もっとも、scoreという変数が何を意味するのか理解できれば良い話ではあるのですが、もしかしたら後編で(教材として挙げられている動画は 5回中3回目なので)その理由が明らかになるのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問