2017-03-16 9 views
0

firebaseからデータを取得し、複数のボタンとラベルに表示しようとしています。 検索後、私は辞書に保存しています。 これはすぐにfirebaseから複数のボタンにアクセスする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

私のモデルであり、私はいくつかの方法を試してみましたが、それはゼロが非同期firebaseのだって考える.I私を返します。

これは私のコードです。

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 
    } 
} 

...これを試してみてください、私はあなたが答えラベルを設定できるように、配列内の要素の順序をシャッフルすることを可能にする拡張機能を追加しました「ランダムに」正しい答えが常に同じ場所にあるとは限りません。拡張子は、正しい答えを選択した場合、選択したボタンのテキストを例if buttonA.title(for: .normal)! == questions[0].correctAnswer {print("correct answer selected)"}のために、質問のcorrectAnswerプロパティに==された場合にだけチェックを知ることthis question here

から@NateCookの礼儀です。 buttonA.title(for: .normal)というオプションの値を必ずアンラップしてください。そうでない場合は、その前に「オプション」という言葉が表示され、正確な回答テキストと正確に等しくなりません。

+0

はい、ボタンの表示に使用します。今私の問題はすべてcorrectAnswerが常に正しい回答ボタンにあることです。しかし、私はこれを尋ねるチャンスを取るだろう、どのように私はそれをランダムなボタンに表示し、クリックされたボタンが正しい答えであるかを知ることができる(print文で十分である)。 –

+0

私の更新された答えを見て、これは正解であると受け入れるかもしれない – MikeG

+0

心の底から。ありがとうございました!あなたは私をたくさん助けました。それは今ではうまくいきます。最後の段落をありがとう、私は次に何をするかの概要を知るのに役立ちます。もう一度ありがとう:) –

関連する問題