2017-04-11 76 views
0

我目前有一個webservice鏈接,它有一個問題和一組答案。我需要我的pickerview加載這些答案,但是這不是加載數組或任何數據。數組的名字叫做「答案」從Web服務獲取數組到一個pickerview

class QuestionsViewController: UIViewController, UIPickerViewDelegate { 

@IBOutlet weak var usernamelabel: UILabel! //sets username label 
@IBOutlet weak var Next: UIButton! //next button 
@IBOutlet weak var itemLabel: UILabel! //item user has selected 
@IBOutlet weak var Question: UILabel! //sets question label 
@IBOutlet weak var pickerview: UIPickerView! //sets picker view 

public var totalQuestions: Int = 0 //sets total question to 0 
public var currentQuestion = 0 //sets current question to 0 
public var totalCorrect: Int = 0 //sets totalcorrect to 0 
var itemSelected: String = "" //item selected 
var LabelText = String() 
//let Exam = QuestionList() //uses the questions class for instances 
//var Questions = QuestionList.getDummyQuestions() 
@IBOutlet weak var share: UIButton! 


//var listQuestions = [[String: AnyObject]]() 

var listQuestions = [[String: AnyObject]]() 
var titles: [String] = [] 



var quiz = QuestionList() 

var ref: FIRDatabaseReference! 
var refHandle: UInt! 


override func viewDidLoad() { 


    super.viewDidLoad() //when the app is loaded 
    //authPlayer() 

    let url:String = "https://api.mlab.com/api/1/databases/quiz/collections/question?apiKey=NT28RNl6jX3Ys0x5GJZ6mMSRQEcb_6KA" 

    let urlRequest = URL(string: url) 

    URLSession.shared.dataTask(with: urlRequest!, completionHandler: { 
     (data, response, error) in 
     if(error != nil){ 
      print(error.debugDescription) 
     } 
     else{ 
      do{ 
       self.listQuestions = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:AnyObject]] 

       //self.tableview.reloadData() 

      }catch let error as NSError{ 
       print(error) 
      } 
     } 
    }).resume() 


    share.isHidden = true 

    ref = FIRDatabase.database().reference() //reference 
    refHandle = ref.child("Questions").observe(.value, with: { (snapshot)in 
     let dataDict = snapshot.value as! [String: AnyObject] 
     print (dataDict) 
    }) 
    usernamelabel.text = LabelText //username 

    pickerview.delegate = self 

    itemLabel.text = "" //loads the item label of whats selected 
    totalQuestions = QuestionList.getDummyQuestions().count 
    itemSelected = QuestionList.getDummyQuestions()[currentQuestion].answers[currentQuestion] //initially when loaded first item is selected 
    itemSelected = QuestionList.getDummyQuestions()[currentQuestion].answers[1] 
    //Question.text = QuestionList.getDummyQuestions()[currentQuestion].quest 
    //Question.text = Exam.quiz[currentQuestion][0] //first element in first row of array 
    Question.text = QuestionList.getDummyQuestions()[currentQuestion].quest 
    //cell.EventImgView.image = event["Image"] as? UIImage 

    //Question.text = q["Title"] as? String 




} 


func numberOfComponents(in pickerView: UIPickerView) -> Int { 

    return 1 //return one component from the picker 
} 

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{ 
    //return QuestionList.getDummyQuestions()[currentQuestion].answers.count 
    //let q = listQuestions[row] 
    //return listQuestions[currentQuestion].count[row] 
    //return listQuestions.count[row] 
    return listQuestions.count 
} 

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{ 


    //return QuestionList.getDummyQuestions()[currentQuestion].answers[row] 
    let q = listQuestions[row] 
    return q["Answers"] as? String 

    //cell.EventImgView.image = event["Image"] as? UIImage 

} 

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){ 

    itemSelected = QuestionList.getDummyQuestions()[currentQuestion].answers[row] 

} 

@IBAction func btnShareClicked(_ sender: UIButton) { 

    if SLComposeViewController.isAvailable(forServiceType: SLServiceTypeFacebook) { 

     let fbShare:SLComposeViewController = SLComposeViewController(forServiceType:SLServiceTypeFacebook) 
     //fbShare.setInitialText("You Scored on the IT Quiz:" + itemLabel.text!) 
     fbShare.setInitialText("You Scored " + itemLabel.text! + " on the IT Quiz") 
     self.present(fbShare, animated:true, completion:nil) 

    } else { 
     let alert = UIAlertController(title: "Account", message: "Please login to Facebook", 
     preferredStyle: UIAlertControllerStyle.alert) 

     alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:nil)) 
     self.present(alert, animated: true, completion: nil) 

    } 

} 

func addGC(_ sender: Any) { 


} 

/*func authPlayer() { 
    let localPlayer = GKLocalPlayer.localPlayer() 
    localPlayer.authenticateHandler = { 
     (view, error) in 

     if view != nil { 
      self.present(view!, animated:true, completion: nil) 
     } 
     else { 
      print(GKLocalPlayer.localPlayer().isAuthenticated) 
     } 
    } 

} 

func saveHighScore(score: String) { 
    if GKLocalPlayer.localPlayer().isAuthenticated { 

    } 
}*/ 





@IBAction func NextAction(_ sender: Any){ 


    if (QuestionList.getDummyQuestions()[currentQuestion].isCorrectQuestion(itemSelected: itemSelected)) { 
     totalCorrect += 1 
     itemLabel.text = String(totalCorrect) + "/" + String(totalQuestions) 
    } 

    if(currentQuestion < totalQuestions - 1) { 
     pickerview.reloadAllComponents() 
     itemSelected = QuestionList.getDummyQuestions()[currentQuestion].answers[1] 
     Question.text = QuestionList.getDummyQuestions()[currentQuestion].quest 
     currentQuestion = currentQuestion + 1 //moves onto next question and increments 


    } else { 
     pickerview.isHidden = true 
     Question.text = "You have finished" 
     Next.isHidden = true 
     share.isHidden = false; 
    } 

} 

}

回答

0

選擇器視圖是空的,因爲你需要你收到JSON響應後重新加載選擇器視圖。所以這條線後

self.listQuestions = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:AnyObject]] 

添加在

self.pickerview.reloadAllComponents() 

------- ------編輯

你看不到任何東西的原因是因爲你的JSON解析是錯誤的。你JSON返回答案,問題& _id返回。你的listQuestions將會是這3個元素。你需要做的是提取答案數組。

正如現在,你在做

let q = listQuestions[row] 
return q["Answers"] as? String 

q將是元件的陣列[0],對於元件的字符串[1]和字典元件[2]

---編輯---- 好吧,如我所說,你的第二個問題是,你沒有解析你的JSON到正確的格式,所以標題不會顯示。 你已經宣佈冠軍陣讓你的代碼更改此

URLSession.shared.dataTask(with: urlRequest!, completionHandler: { 
     (data, response, error) in 
     if(error != nil){ 
      print(error.debugDescription) 
     } 
     else{ 
      do{ 
       self.listQuestions = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:AnyObject]] 

       for elements in self.listQuestions { 
        for object in elements { 
         if object.key == "Answers" { 
          if let answers = object.value as? [String] { 
           self.titles = answers 
          } 
         } 
        } 
       } 
       self.pickerview.reloadAllComponents() 

      }catch let error as NSError{ 
       print(error) 
      } 
     } 
    }).resume() 

那麼顯然更新您的選擇器視圖的委託方法

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{ 
    return self.titles[row] 
} 

&

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{ 
    return titles.count 
} 
+0

這仍然沒有加載組件在pickerview內? – Jonathon

+0

好吧,它會。但是你的代碼是錯誤的。讓我編輯我的答案來解釋 – Devster101

+0

感謝您的解釋,以便如何獲得我的代碼中的answers數組元素?謝謝 – Jonathon