从Web服务获取数组到pickerview

时间:2017-04-11 21:18:58

标签: ios swift uipickerview nsurlsession mlab

我目前有一个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;
    }

}

}

1 个答案:

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