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

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

ただいまの
回答率

88.91%

クイズアプリ 合計点表示

受付中

回答 2

投稿 編集

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

yamadayeah90

score 0

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

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

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

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

コードimport UIKit

class Question1ViewController: UIViewController {

   var score1 = 0
    @IBAction func q11(){
        score1 += 0
    }
    @IBAction func q12(){
        score1 += 0
    }
    @IBAction func q13(){
        score1 += 1
    }
    @IBAction func q14(){
        score1 += 0
    }


    override func viewDidLoad() {
        super.viewDidLoad()



        // Do any additional setup after loading the view.
        func prepareForSegue(segue: UIStoryboardSegue, sender:AnyObject?){
            var aD:  AppDelegate = UIApplication.shared.delegate as!
            AppDelegate

            aD.score +=  score1
        }
    }

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

コードimport UIKit

class ResultViewController: UIViewController {
    @IBOutlet var scoreLavel: UILabel!
    @IBOutlet var massageLavel:UILabel!


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        let aD:AppDelegate = UIApplication.shared.delegate as! AppDelegate
        var scores:Int = aD.score * 10000000
        scoreLavel.text = "\(scores)だ!!"

        if  scores < 10000000{
            massageLavel.text = "あなたは道化のバギーレベルです"
        }else if scores < 50000000{
            massageLavel.text = "あなたはナミです"
        }else if scores < 100000000{
            massageLavel.text = "あなたはルフィーレベルです"
        }
        aD.score = 0;
        aD.records.append(aD.score as AnyObject)

    }


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • TsukubaDepot

    2020/07/14 01:22 編集

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

    どのような本を参考にして作られたのでしょうか。私の手元にない可能性もありますが、参考にされた書籍を例示された方がいいかもしれません。

    また、関数の書き方や UIApplication.shared.delegate が出てくるあたりが一般的でなく感じるのですが、これもどこかに記載されていた方法でしょうか。

    また、コードについてはスクリーンショットではなく、このコメントでなくコメント本文に追記していだければと思います。
    コードを貼り付けた後、そのコードをドラッグして、質問画面の<CODE>ボタンを押すことで、整形されたコードを表示することが可能ですので、ぜひご協力ください。

    キャンセル

  • fuzzball

    2020/07/14 10:12

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

    キャンセル

  • snowdropAPP

    2020/07/14 11:23 編集

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

    キャンセル

回答 2

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/14 18:23

    実は動画がそのようになっているみたいです(17分あたり)。オリジナルは [Any]の配列に String や Int をねじ込んでいるのですが、そのうち質問者さんは Int だけを使っているのだと思います(なので、 AnyObject にキャストしていると思われます)。

    もっとも、scoreという変数が何を意味するのか理解できれば良い話ではあるのですが、もしかしたら後編で(教材として挙げられている動画は 5回中3回目なので)その理由が明らかになるのかもしれません。

    キャンセル

0

動かない理由なのですが

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

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

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

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

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

override func viewDidLoad() {
        super.viewDidLoad()

        func prepareForSegue(segue: UIStoryboardSegue, sender:AnyObject?){
            var aD:  AppDelegate = UIApplication.shared.delegate as!
        // 中略
        }
    }

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

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

したがって、

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func prepareForSegue(segue: UIStoryboardSegue, sender:AnyObject?){
        // 中略
    }

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

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

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

つまり、

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        var aD:  AppDelegate = UIApplication.shared.delegate as!
        AppDelegate

        aD.score +=  score1
    }

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/14 23:52

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

    キャンセル

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

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

関連した質問

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