Как правильно установить для моей переменной значение в Firebase, а не для сброса прогресса? - PullRequest
0 голосов
/ 07 ноября 2018

Каждый раз, когда я покидаю этот ViewController и затем возвращаюсь, тест начинается с вопроса 1. Я хочу, чтобы он возобновился с того места, где я остановился.

Я полагаю, почему он продолжает сбрасываться на ноль, потому что мой начальный «questionNumber» установлен в 0, но я не уверен, как правильно установить его значение в Firebase. Я получаю ошибку за ошибкой. Я пробовал так много разных способов, но ни один из них, похоже, не работает и не возобновляет с того места, где я остановился. Спасибо за вашу помощь! ПОЖАЛУЙСТА, помогите мне!

class CryptoViewController: UIViewController {

    var questionList = CryptoBank()
    var score = 0
    var pickedQuestion = 0
    var uid = FIRAuth.auth()?.currentUser?.uid
    var questionNumber = 0

    @IBOutlet weak var questionViewer: UILabel!
    @IBOutlet weak var choiceOne: UIButton!
    @IBOutlet weak var choiceTwo: UIButton!
    @IBOutlet weak var choiceThree: UIButton!
    @IBOutlet weak var scoreLabel: UILabel!
    @IBOutlet weak var questionNumberView: UILabel!
    @IBOutlet weak var progressBarView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        choiceOne.titleLabel?.textAlignment = NSTextAlignment.center
        choiceTwo.titleLabel?.textAlignment = NSTextAlignment.center
        choiceThree.titleLabel?.textAlignment = NSTextAlignment.center
        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.navigationController?.navigationBar.isTranslucent = true
        self.navigationController?.view.backgroundColor = .clear
       update()
    }


    @IBAction func buttonPressed(_ sender: AnyObject) {
        if sender.tag == 1 {
            pickedQuestion = 1}
        else if sender.tag == 2 {
            pickedQuestion = 2}
        else if sender.tag == 3 {
            pickedQuestion = 3}
        checkAnswer()
        questionNumber += 1
        nextQuestion()
    }

    func checkAnswer(){
        let correctAnswer = questionList.cryptoBank[questionNumber].answer
        if pickedQuestion == correctAnswer {
            score += 1
        }else{
            print("Wrong Answer")
        }
    }

    func updateFirebase(){
        let ref = FIRDatabase.database().reference()
        guard let uid = FIRAuth.auth()?.currentUser!.uid else{
            return}
        ref.child("Users").child(uid).child("Cryptoquiz").child("Question Number").setValue(questionNumber)
        ref.child("Users").child(uid).child("Cryptoquiz").child("Score").setValue(score)
    }

    func nextQuestion(){
        if questionNumber <= 9 {
            update()
        } else{

            scoreLabel.text = "Score: \(score)"
            let alert = UIAlertController(title: "Done!", message: "Would you like to restart?", preferredStyle: .alert)
            let restartAction = UIAlertAction(title: "Restart", style: .default, handler: { (UIAlertAction) in
                self.startAgain()
            })
            alert.addAction(restartAction)
            present(alert, animated: true, completion: nil)
        }}

    func update(){
        let nextQuest = questionList.cryptoBank[questionNumber]
        questionViewer.text = nextQuest.question
        choiceOne.setTitle(nextQuest.choice1, for: .normal)
        choiceTwo.setTitle(nextQuest.choice2, for: .normal)
        choiceThree.setTitle(nextQuest.choice3, for: .normal)
        scoreLabel.text = "Score: \(score)"
        questionNumberView.text = "Question: \(questionNumber + 1)"
        progressBarView.frame.size.width = (view.frame.size.width/9)  * CGFloat(questionNumber + 1)
        updateFirebase()

    }


    }

1 Ответ

0 голосов
/ 07 ноября 2018

Вы можете сохранить свой прогресс в UserDefaults в viewDidDisappear() следующим образом:

UserDefaults.standard.set(questionNumber, forKey: "questionNumber")

И затем каждый раз, когда вы открываете свое представление, в viewDidLoad() или в viewDidAppear() вы обновляете свой вопрос. Число выглядит следующим образом:

let questionNumberSaved = UserDefaults.standard.integer(forKey: “questionNumber”) ?? 0
questionNumber = questionNumberSaved

Затем после этого вы вызываете свой updateFirebase() метод

...