swift - 如何将我的变量正确设置为 Firebase 上的值而不让它重置进度?
问题描述
每次我离开这个 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()
}
}
解决方案
您可以像这样保存UserDefaults
进度viewDidDisappear()
:
UserDefaults.standard.set(questionNumber, forKey: "questionNumber")
然后每次打开视图时,在viewDidLoad()
或在viewDidAppear()
您更新您的 questionNumber 时,如下所示:
let questionNumberSaved = UserDefaults.standard.integer(forKey: “questionNumber”) ?? 0
questionNumber = questionNumberSaved
然后在这样做之后你调用你的updateFirebase()
方法
推荐阅读
- python - Python Tkinter:_tkinter.TclError:图像“pyimage1”不存在
- php - php 选择控件更改布局
- telegram - 使用 Telethon 在所有 Telegram 组中搜索单词
- r - data$Y_i1 中的错误:“闭包”类型的对象不可子设置
- reactjs - 由于 ESLint 错误,我的 create-react-app 无法编译
- laravel - laravel 错误:rand() 期望参数 2 为 int, string
- python - SyntaxError:Python 关键字在 numexpr 查询中无效标识符
- android - Kotlin - 处理来自 EditText 的名称
- python - WebDriverException:消息:无效参数:无法终止退出的进程 Selenium python
- javascript - 如何根据选定的列表选项在页面加载时显示默认选项卡 (div)