简体   繁体   中英

xcode swift: NSUserDefaults : save the highscore if quit app and restart it where left off

I am making a quiz app. So basically I have scores and high scores and I want to display and store the results on the main View Controller.

I can display the results but can't save them. Please help! Also I want that if I quit my app on question 2, it will restart from there instead of the isInitialViewController. Any help for these two topics will be very appreciated.

Below is the code for the main profile which is loading the scores but once you quit the app and reload it, the numbers disappear:

import UIKit
import Parse
import ParseUI
import CoreData
import Foundation

class UserProfileViewController: UIViewController {

    @IBOutlet var scoreLabelUser: UILabel!
    var scoringString = String()

    @IBOutlet var HighScoreLabelUser: UILabel!
    var highscoreString = String()

    @IBOutlet var HighScoreLabel: UILabel!
    var HighscoreInt = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        var highScoreDefault2 = NSUserDefaults.standardUserDefaults()
        if (highScoreDefault2.valueForKey("EASYHIGHSCORE") != nil)
        {
        HighscoreInt = highScoreDefault2.valueForKey("EASYHIGHSCORE") as! NSInteger
            //highscoreString = highScoreDefault2.valueForKey("EASYHIGHSCORE") as! String
            HighScoreLabel.text = NSString(format: "%i", HighscoreInt) as String

        }

        assignScores()

    }



    func assignScores() {

        scoreLabelUser.text = NSString(format: "%@", scoringString) as String
        HighScoreLabelUser.text = NSString(format: "%@", highscoreString) as String
        HighScoreLabel.text = "\(highscoreString)"

        var highScoreDefault2 = NSUserDefaults.standardUserDefaults()
        highScoreDefault2.setValue(HighscoreInt, forKey: "EASYHIGHSCORE")

    }

}

I have the second ViewController which actually have the quiz and is calculating the scores and highscores.

//
//  EasyQuizViewController.swift
//  Quiz

    import UIKit
    import CoreData
    import AVFoundation

    class EasyQuizViewController: UIViewController {

        @IBOutlet var sequence: UILabel!

        @IBOutlet var questionLabel: UILabel!

        @IBOutlet var Button1: UIButton!
        @IBOutlet var Button2: UIButton!
        @IBOutlet var Button3: UIButton!
        @IBOutlet var Button4: UIButton!

        @IBOutlet var scoreLabel: UILabel!
        @IBOutlet var highscoreLabel: UILabel!

        var CorrectAnswer = String()
        var questionNumber = 0

        var score = 0
        var highScore = 0


        override func viewDidLoad() {
            super.viewDidLoad()

            var highScoreDefault = NSUserDefaults.standardUserDefaults()

            if (highScoreDefault.valueForKey("HIGHSCORE") != nil)
            {
            highScore = highScoreDefault.valueForKey("HIGHSCORE") as! NSInteger!
            highscoreLabel.text = NSString(format: "%i", highScore) as String
            }
            generateNewNumber()

            // Do any additional setup after loading the view.
        }


        func generateNewNumber() {

            questionNumber += 1

            switch(questionNumber) {

            case 1:

                sequence.text = "\(questionNumber)/50"
                questionLabel.text = "Which is the country with the most people?"
                Button1.setTitle("United States of America", forState: UIControlState.Normal)
                Button2.setTitle("South Africa", forState: UIControlState.Normal)
                Button3.setTitle("China", forState: UIControlState.Normal)
                Button4.setTitle("India", forState: UIControlState.Normal)

                CorrectAnswer = "3"

                break

            case 2:

                sequence.text = "\(questionNumber)/50"
                questionLabel.text = "Which is the planet closest to the Sun?"
                Button1.setTitle("Venus", forState: UIControlState.Normal)
                Button2.setTitle("Jupiter", forState: UIControlState.Normal)
                Button3.setTitle("Earth", forState: UIControlState.Normal)
                Button4.setTitle("Mercury", forState: UIControlState.Normal)

                CorrectAnswer = "4"

                break


            default:

                var alert = UIAlertView(title: "Finished", message: "Your quiz has been completed. Click Okay to view scores.", delegate: self, cancelButtonTitle: "Ok")

                alert.show()

                //println("\(score)")
                //println("\(highScore)")

                scoreLabel.text = NSString(format: "%i", score) as String

                if (score > highScore) {
                    highScore = score

                highscoreLabel.text = NSString(format: "%i", highScore) as String
                }


                var highScoreDefault = NSUserDefaults.standardUserDefaults()

                highScoreDefault.setValue(highScore, forKey: "HIGHSCORE")






                self.profileScreen()


            break

            }

        }




        @IBAction func Button1Action(sender: AnyObject) {

            if (CorrectAnswer == "1")
            {

                score += 1
                generateNewNumber()
            }
            else {

                generateNewNumber()
            }
        }

        @IBAction func Button2Action(sender: AnyObject) {

            if (CorrectAnswer == "2")
            {

                score += 1
                generateNewNumber()
            }
            else {

                generateNewNumber()
            }
        }

        @IBAction func Button3Action(sender: AnyObject) {

            if (CorrectAnswer == "3")
            {

                score += 1
                generateNewNumber()
            }
            else {

                generateNewNumber()
            }
        }

        @IBAction func Button4Action(sender: AnyObject) {

            if (CorrectAnswer == "4")
            {

                score += 1
                generateNewNumber()
            }
            else {

                generateNewNumber()
            }
        }


        @IBAction func BackBtn(sender: AnyObject) {
            self.performSegueWithIdentifier("backToProfile", sender: self)
        }

        func profileScreen() {
            self.performSegueWithIdentifier("backToProfile", sender: self)
        }


        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
            var destinationViewController : UserProfileViewController = segue.destinationViewController as! UserProfileViewController


            //println("\(scoreLabel)")
            //println("\(highscoreLabel)")

            destinationViewController.scoringString = NSString(format: "%i", score) as String
            destinationViewController.highscoreString = NSString(format: "%i", highScore) as String
            //destinationViewController.HighscoreInt = NSString(format: "%i", highScore) as String
            //destinationViewController.HighscoreInt = (highScore) as NSInteger


        }


    }

You should store your NSUserDefaults when the user quits your app:

func applicationDidEnterBackground(application: UIApplication) {
    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.synchronize()
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM