ios - 从 Web 服务获取数组到 pickerview

标签 ios swift uipickerview nsurlsession mlab

我目前有一个网络服务链接,其中包含一个问题和一系列答案。我需要我的 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;
    }

}

}

最佳答案

选择器 View 为空,因为您需要在收到 JSON 响应后重新加载选择器 View 。所以在这一行之后

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

添加

self.pickerview.reloadAllComponents()

--------编辑------

您看不到任何内容的原因是您的 JSON 解析错误。您的 JSON 返回答案、问题和 _id。您的问题列表将是这 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()

然后显然将您的选择器 View 委托(delegate)方法更新为

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
}

关于ios - 从 Web 服务获取数组到 pickerview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43356368/

相关文章:

ios - 如何触发 UISearchBar 委托(delegate)单次?

ios - 当 UITabBarController 插入容器 View 时隐藏 UITabBar

swift 常量文件?

ios - 如何在 inputView 中设置默认日期值

iphone - 多个 UIPickerView

iphone - 如何在 iOS iPhone 应用程序上以编程方式轻松连续播放 .m4a 文件

ios - Swift 为文本字段影子代码创建扩展

ios - 单例中 getter 和 setter 的线程安全

swift - UIPickerViewDelegate Xcode 8 swift 3

ios - CL位置,地理编码器和区域搜索