【问题标题】:How to display JSON into UILabel using UIPickerView in Swift 3.0?如何在 Swift 3.0 中使用 UIPickerView 将 JSON 显示到 UILabel 中?
【发布时间】:2017-03-22 01:40:28
【问题描述】:

我有这些使用 PHP 的 JSON 输出。

[
    {"number":"001","name":"MIKE"},
    {"number":"002","name":"JOSH"}
]

在 Swift 中,我设法选择了 "name" 值并将其显示到 UIPickerView 中,如下所示。

DropdownJSON.swift

import UIKit

class DropdownJSON: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {
    @IBOutlet var dropdownTxt: UITextField!
    @IBOutlet var dropdownPV: UIPickerView!

    @IBOutlet var numberLbl: UILabel!
    @IBOutlet var nameLbl: UILabel!

    var persons = [Person]()

    struct Person {
        var number:String
        var name: String

        init?(dict: [String:Any]) {
            guard let number = dict["number"] as? String, let name = dict["name"] as? String else {
                return nil
            }
            self.number = number
            self.name   = name
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        getDropdownJSON()
    }

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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return self.persons.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return persons[row].name
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        self.numberLbl.text      = self.persons[row].number
        self.nameLbl.text        = self.persons[row].name
        self.dropdownPV.isHidden = true
        self.dropdownTxt.resignFirstResponder()
    }

    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField == self.dropdownTxt{
            self.dropdownPV.isHidden = false
        }
    }

    func getDropdownJSON() {
        let url = URL(string: "http://localhost/DropdownJSON.json")
        let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
            guard let data = data, error != nil else {
                print(error?.localizedDescription)
                return
            }
            if let array = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [[String:Any]] {
                self.persons = array.flatMap(Person.init)
                DispatchQueue.main.async {
                    self.dropdownPV.reloadAllComponents()
                }
            }
        }
        task.resume()
    }
}

但我的目标是在 function pickerView (didSelectRow) 中显示 JSON 输出 "number" 到 numberLbl"name" 到 nameLbl

原因是我想稍后再发布 numberLbl。 nameLbl 只是显示在屏幕页面上。

有可能吗?感谢有人可以在这件事上提供帮助。

更新

谢谢。

【问题讨论】:

    标签: json swift3 uipickerview


    【解决方案1】:

    首先,您需要使用URLSession.dataTask 来获得来自URL 的响应,而不是NSData(contentsOf:)。同样在 Swift 3 中使用原生 URLData 而不是 NSURLNSData

    现在的问题是您没有存储number 值形式的字典。管理这种情况的最简单方法是创建struct 并同时存储numbername 值。之后创建该结构的数组而不是 AnyObject 的数组。

    struct Person {
        var number:String 
        var name: String 
    
        init?(dict: [String:Any]) {
            guard let number = dict["number"] as? String, let name = dict["name"] as? String else {
                return nil
            }
            self.number = number
            self.name = name
        }
    }
    

    现在声明一个结构数组 Person 并使用您的 getDropdownJSON 方法在其中添加数据。

    var persons = [Person]()
    
    func getDropdownJSON() {
        let url = URL(string: "http://localhost/getDropdownJSON.json")
        let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
            guard let data = data, error == nil else {
                print(error?.localizedDescription)
                return
            }
            if let array = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [[String:Any]] {
                self.persons = array.flatMap(Person.init)
                DispatchQueue.main.async {
                    dropdownPV.reloadAllComponents()
                }
            }
        }
        task.resume()
    }
    

    现在在PickerViewDelegate 方法中使用这个数组来填充它的组件。

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return self.persons.count
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return persons[row].name
    }
    

    现在在didSelectRow 中,您只需访问数组对象,您将获得numbername 两者。

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if row >= self.persons.count { 
            return
        }
    
        self.numberLbl.text = self.persons[row].number
        self.nameLbl.text = self.persons[row].name
        self.dropdownPV.isHidden = true
        self.dropdownTxt.resignFirstResponder()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 2020-10-02
      • 1970-01-01
      相关资源
      最近更新 更多