我目前有一个Web服务链接,其中包含一个问题和一系列答案。我需要我的pickerview来加载这些答案但是这并没有加载所有数据或任何数据。数组的名称称为“Answers”
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 :(得分:0)
选择器视图为空,因为您需要在收到JSON响应后重新加载选取器视图。所以在这一行之后
self.listQuestions = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:AnyObject]]
加入
self.pickerview.reloadAllComponents()
-------编辑------
您没有看到任何内容的原因是因为您的JSON解析错误。你JSON返回答案,问题&amp; _id回来。您的listQuestions将是这3个元素。你需要做的是提取答案数组。
就在现在,你正在做什么
let q = listQuestions[row]
return q["Answers"] as? String
q将是元素[0]的数组,元素[1]的字符串和元素[2]的字典
---编辑---- 好吧,正如我所说,你的第二个问题是你没有将你的JSON解析成正确的格式,所以标题不会显示。 您已经声明了titles数组,因此请将代码更改为
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
}