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