2017-04-11 5 views
0

J'ai actuellement un lien webservice qui a une question et un tableau de réponses. J'ai besoin de mon pick pick pour charger ces réponses, mais cela ne charge pas le tableau du tout ou des données. Le nom du tableau est appelé « Réponses »obtenir un tableau d'un service Web dans une sélection

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

} 

}

Répondre

0

La vue du sélecteur est vide que vous avez besoin de recharger la vue du sélecteur après avoir reçu la réponse JSON. Donc, après cette ligne

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

Ajouter au

self.pickerview.reloadAllComponents() 

------- ------ EDIT

La raison pour laquelle vous ne voyez rien parce que votre JSON l'analyse est erronée. Vous JSON renvoie réponses, questions & _id retour. Vos listQuestions vont être ces 3 éléments. Ce que vous devez faire est d'extraire le tableau des réponses.

Comme en ce moment, vous faites

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

q serait un tableau pour l'élément [0], une chaîne pour l'élément [1] et un dictionnaire pour l'élément [2]

--- EDIT ---- Ok, comme je l'ai dit, votre deuxième problème est que vous n'avez pas analysé votre JSON dans le bon format, donc le titre ne sera pas affiché. Vous avez déjà déclaré un tableau titres pour changer votre code à ce

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() 

ensuite mettre à jour évidemment votre point de vue Préparateur méthodes de délégué à

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

Ceci est toujours pas de charger les composants dans la sélection? – Jonathon

+0

Eh bien, ce sera le cas. Mais votre code est faux. Permettez-moi de modifier ma réponse pour expliquer – Devster101

+0

Merci pour l'explication alors comment pourrais-je obtenir l'élément de tableau de réponses dans mon code? Merci – Jonathon