【问题标题】:picker view not loading items选择器视图未加载项目
【发布时间】:2017-04-13 11:59:21
【问题描述】:

我目前在使用 pickerview 时遇到问题,因为当我在应用程序上单击 play quiz 时,picker view 根本没有从 Web 服务加载。选择器视图应显示来自 Web 服务的答案数组。选择器视图是空的有什么想法吗?另外问题是不是从 Web 服务加载为文本标签?

class QuestionsViewController: UIViewController, UIPickerViewDelegate {

@IBOutlet weak var usernamelabel: UILabel!
@IBOutlet weak var itemlabel: UILabel!
@IBOutlet weak var Question: UILabel!
@IBOutlet weak var pickerview: UIPickerView!

public var totalQuestions: Int = 0
public var currentQuestion = 0
public var totalCorrect: Int = 0
var itemSelected: String = ""
@IBOutlet weak var share: UIButton!
var LabelText = String()


var listQuestions = [[String: Any]]()
var titles: [String] = []
var qnames: String = ""

@IBOutlet weak var Next: UIButton!
var quiz = QuestionList()

override func viewDidLoad() {
    super.viewDidLoad() //when the app is loaded


    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]]
                print(self.listQuestions)

                for elements in self.listQuestions {
                    for object in elements {
                        if object.key == "Answers" {
                            if let answers = object.value as? [String] {
                                self.titles = answers
                            }
                            if object.key == "Questions" {
                                if let questions = object.value as? String {
                                    self.qnames = questions
                                }
                            }
                        }
                    }
                }
                self.pickerview.reloadAllComponents()

            }catch let error as NSError{
                print(error)
            }
        }
    }).resume()


}


func numberOfComponents(in pickerView: UIPickerView) -> Int {

    return 1 //return one component from the picker
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{

    return titles.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) ->String?{


    return self.titles[row]


}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){

    itemSelected = QuestionList.getDummyQuestions()[currentQuestion].answers[row]

}

@IBAction func btnShareClicked(_ sender: Any) {
    if SLComposeViewController.isAvailable(forServiceType: SLServiceTypeFacebook) {

        let fbShare:SLComposeViewController = SLComposeViewController(forServiceType:SLServiceTypeFacebook)
        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)

    }


}





}

【问题讨论】:

    标签: ios swift uipickerview mlab


    【解决方案1】:

    您的ViewController 缺少UIPickerViewDataSource 协议:

    class QuestionsViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {}
    

    确保将pickerView 的delegatedatasource 设置为当前的viewController

    override func viewDidLoad() {
        super.viewDidLoad() //when the app is loaded
    
        pickerview.delegate = self
        pickerview.dataSource = self
    }
    

    dataTask 是一个异步任务,你应该在主线程上更新 UI。

    DispatchQueue.main.async {
        self.pickerview.reloadAllComponents()
    }
    

    最终的代码应该是这样的:

    class QuestionsViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    
        @IBOutlet weak var usernamelabel: UILabel!
        @IBOutlet weak var itemlabel: UILabel!
        @IBOutlet weak var Question: UILabel!
        @IBOutlet weak var pickerview: UIPickerView!
    
        public var totalQuestions: Int = 0
        public var currentQuestion = 0
        public var totalCorrect: Int = 0
        var itemSelected: String = ""
        @IBOutlet weak var share: UIButton!
        var LabelText = String()
    
    
        var listQuestions = [[String: Any]]()
        var titles: [String] = []
        var qnames: String = ""
    
        @IBOutlet weak var Next: UIButton!
        var quiz = QuestionList()
    
        override func viewDidLoad() {
            super.viewDidLoad() // when the app is loaded
    
            pickerview.delegate = self
            pickerview.dataSource = self
    
            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]]
                        print(self.listQuestions)
    
                        for elements in self.listQuestions {
                            for object in elements {
                                if object.key == "Answers" {
                                    if let answers = object.value as? [String] {
                                        self.titles = answers
                                    }
                                }
                                if object.key == "Questions" {
                                    if let questions = object.value as? String {
                                        self.qnames = questions
                                    }
                                }
                            }
                        }
    
                        DispatchQueue.main.async {
                            self.pickerview.reloadAllComponents()
                            self.Question.text = self.qnames
                        }
    
                    }catch let error as NSError{
                        print(error)
                    }
                }
            }).resume()
        }
    
    
        func numberOfComponents(in pickerView: UIPickerView) -> Int {
            return 1 //return one component from the picker
        }
    
        func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
            return titles.count
        }
    
        func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) ->String? {
            return self.titles[row]
        }
    
        func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){
    
            itemSelected = QuestionList.getDummyQuestions()[currentQuestion].answers[row]
    
        }
    
        @IBAction func btnShareClicked(_ sender: Any) {
            if SLComposeViewController.isAvailable(forServiceType: SLServiceTypeFacebook) {
    
                let fbShare:SLComposeViewController = SLComposeViewController(forServiceType:SLServiceTypeFacebook)
                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)
    
            }
        }
    }
    

    【讨论】:

    • 谢谢这是有效的,但我如何让问题标签从网络服务中出现。 Web 服务中的这个名称是“问题”?谢谢
    • 我刚刚更新了答案。现在,您可以从 Web 服务中检索 Question。我假设您代码中的 Question 是您要显示的问题标签。
    • 好的,谢谢,调用的函数在选择器视图中选择行怎么样
    • 你想问什么?
    • 我想知道用户选择了哪一行,但没有从任何虚拟数据中执行此操作,但 Web 服务或实现此操作的最佳方式?
    【解决方案2】:

    获取问题标签:

    for object in elements {
    
          if let result = object["Questions"] as? [String: AnyObject] {
    
               print(result)
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      相关资源
      最近更新 更多