2017-03-16 62 views
0

我试图从firebase检索数据并显示到多个按钮和标签。 检索后,我将它保存到字典中。 这是我的模型从firebase检索到多个按钮在swift 3

import Foundation 
import Firebase 

    class QuestionModel: NSObject { 

     var CorrectAnswer: String! 
     var Question: String! 
     var optionA: String! 
     var optionB: String! 
     var optionC: String! 

     init(snapshot: FIRDataSnapshot) { 
      if let snapshotDict = snapshot.value as? Dictionary<String, Any> { 
       CorrectAnswer = snapshotDict["CorrectAnswer"] as? String 
       Question = snapshotDict["Question"] as? String 
       optionA = snapshotDict["optionA"] as? String 
       optionB = snapshotDict["optionB"] as? String 
       optionC = snapshotDict["optionC"] as? String 
      } 
     } 
    } 

我的JSON

enter image description here

我尝试了一些方法,但它返回我。我想怎么把异步火力的。

这是我的代码。

import Foundation 
import UIKit 
import Firebase 
import FirebaseDatabase 

class AnsweringQuestionViewController: UIViewController { 

    @IBOutlet weak var qLabel: UILabel! 
    @IBOutlet weak var buttonA: UIButton! 
    @IBOutlet weak var buttonB: UIButton! 
    @IBOutlet weak var buttonC: UIButton! 
    @IBOutlet weak var correctAnswer: UIButton! 

    //var buttons: [UIButton]! thinking of using button tags? 

    var ref: FIRDatabaseReference! 
    var questionModel : [QuestionModel] = [] 

    override func viewDidLoad(){ 
     super.viewDidLoad() 
     // FIRDatabase.database().persistenceEnabled = true 
     ref = FIRDatabase.database().reference() 
     db() 
    } 
    func db(){ 
     ref.child("Science").observe(.value, with: { 
      snapshot in 
      for child in snapshot.children { 
       let user = QuestionModel.init(snapshot: (child as? FIRDataSnapshot)!) 
       self.questionModel.append(user) 
      } 
     self.qLabel.text = self.questionModel[0].Question 
     self.buttonA.setTitle("\(self.questionModel[0].CorrectAnswer)", for: UIControlState.normal) 
     }, withCancel: nil) 
     } 
} 

请裸露我的代码我仍然在学习。我不知道该从哪里去显示我的数据到多个按钮,并确定哪个按钮被“点击”是CorrectAnwer。

如果你愿意的话,如果你能够以更简洁的方式重建我的代码,我会非常高兴。谢谢:)

回答

0

尝试......

import FirebaseDatabase 

class Question { 

    var correctAnswer: String? 
    var question: String? 
    var optionA: String? 
    var optionB: String? 
    var optionC: String? 

    init(snapshot: FIRDataSnapshot){ 
     if let snap = snapshot.value as? [String: String] { 
      correctAnswer = snap["CorrectAnswer"] 
      question = snap["Question"] 
      optionA = snap["OptionA"] 
      optionB = snap["OptionB"] 
      optionC = snap["OptionC"] 
     } 
    } 

} 




import FirebaseDatabase 
import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var qLabel: UILabel! 
    @IBOutlet weak var buttonA: UIButton! 
    @IBOutlet weak var buttonB: UIButton! 
    @IBOutlet weak var buttonC: UIButton! 
    @IBOutlet weak var correctAnswer: UIButton! 

    var fireRootRef: FIRDatabaseReference! 
    var questions = [Question]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     fireRootRef = FIRDatabase.database().reference() 
     fetchQuestions(inCategory: "Science") 
    } 


    func fetchQuestions(inCategory category: String){ 
     let questionsRef = fireRootRef.child(category) 

     questionsRef.observe(.value, with: {(snapshot)-> Void in 

      var allQuestions = [Question]() 
      for child in snapshot.children { 
       allQuestions.append(Question(snapshot: child as! FIRDataSnapshot)) 
      } 
      self.questions = allQuestions 
      self.reloadUI(withQuestions: self.questions) 
     }) 
    } 

    func reloadUI(withQuestions questions: [Question]){ 
     guard questions.count > 0 else {return} 

     if let answerToQuestion1 = questions[0].correctAnswer, let wrongAnswer = questions[0].optionA, let wrongAnswer2 = questions[0].optionB, let wrongAnswer3 = questions[0].optionC { 

      let randomOrderedAnswers = [answerToQuestion1, wrongAnswer, wrongAnswer2, wrongAnswer3].shuffled() 

      buttonA.setTitle(randomOrderedAnswers[0], for: .normal) 
      buttonB.setTitle(randomOrderedAnswers[1], for: .normal) 
      buttonC.setTitle(randomOrderedAnswers[2], for: .normal) 
      correctAnswer.setTitle(randomOrderedAnswers[3], for: .normal)//keep in mind the correctAnswer label wont always contain the actual correct answer now 

     } else { 
      print("failed to get value for one of the answes options") 
     } 

     if let questionText = questions[0].question { 
      qLabel.text = questionText 
     } else { 
      qLabel.text = "failed to get question text" 
     } 
    } 

} 




    extension MutableCollection where Indices.Iterator.Element == Index { 
/// Shuffles the contents of this collection. 
    mutating func shuffle() { 
     let c = count 
     guard c > 1 else { return } 

     for (firstUnshuffled , unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) { 
      let d: IndexDistance = numericCast(arc4random_uniform(numericCast(unshuffledCount))) 
      guard d != 0 else { continue } 
      let i = index(firstUnshuffled, offsetBy: d) 
      swap(&self[firstUnshuffled], &self[i]) 
     } 
    } 
} 

extension Sequence { 
    /// Returns an array with the contents of this sequence, shuffled. 
    func shuffled() -> [Iterator.Element] { 
     var result = Array(self) 
     result.shuffle() 
     return result 
    } 
} 

更新 我已经添加了扩展,允许你重新洗牌数组中元素的顺序,使您可以设置标签答案“随机”,正确答案并不总是在同一个地方。扩展是从this question here

@NateCook的礼貌要知道如果选择了正确的答案只是检查所选按钮的文本==这个问题的correctAnswer特性,例如if buttonA.title(for: .normal)! == questions[0].correctAnswer {print("correct answer selected)"}。只要确保打开buttonA.title(for: .normal)的可选值,否则它会在它之前有“可选”一词,因此不会完全等于正确的答案文本。

+0

是的,它可以在按钮中显示。现在我的问题是所有的correctAnswer总是在correctAnswer按钮中。但我有机会问这个问题,我如何将它显示到一个随机按钮中,并知道点击的按钮是否是正确的答案(打印语句对我来说是足够的)。 –

+0

看到我更新的答案,你可能会接受这是正确的答案 – MikeG

+0

从心底。谢谢!你帮了我很多,是现在的作品:)。谢谢你的最后一段,它帮助我了解下一步我会做什么。再次感谢你:) –