快速使用 JSON 数据填充选择器视图的最佳方法是啥?

Posted

技术标签:

【中文标题】快速使用 JSON 数据填充选择器视图的最佳方法是啥?【英文标题】:what is the best way to populate a picker view with JSON data in swift?快速使用 JSON 数据填充选择器视图的最佳方法是什么? 【发布时间】:2020-04-25 18:34:41 【问题描述】:

我正在 ios 上构建 COVID-19 应用跟踪器。

为了按国家/地区显示数据,我构建了一个包含所有国家/地区名称的pickerView。

感谢 HTTP cal,我已经设法获取 JSON 数据,即每个国家/地区的名称。理想情况下,我希望将每个值附加到一个数组中,然后再填充pickerView。

这可能吗?如果是,我会怎么做?

我也对其他方式持开放态度。这是我的代码:

 @IBOutlet weak var confirmedCasesLabel: UILabel!
 @IBOutlet weak var deathsLabel: UILabel!
 @IBOutlet weak var recoveriesLabel: UILabel!

 //MARK: - Relevant variables
 private let covidUrl: String = "https://corona-api.com/countries"
 var countryArray: [String] = [String]()


 override func viewDidLoad() 
     super.viewDidLoad()

     // Do any additional setup after loading the view.
     countryPickerView.delegate = self
     countryPickerView.dataSource = self

     //
     httpCall()
 


 /*
 // MARK: - Navigation

 // In a storyboard-based application, you will often want to do a little preparation before navigation
 override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
     // Get the new view controller using segue.destination.
     // Pass the selected object to the new view controller.
 
 */

 //MARK: - Functions that handles picker view delegates and data source
 func numberOfComponents(in pickerView: UIPickerView) -> Int 
        return 1
    

 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
     return countryArray.count
    

 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? 
     return countryArray[row]
 

 //MARK: - HTTP CALL - GET COUNTRY DATA
 func httpCall() 
     request(covidUrl, method: .get).responseJSON  (response) in
         if response.result.isSuccess 
             //test just print some data
             let dataJSON: JSON = JSON(response.result.value)
             //print(dataJSON)
             //on va identifier chaque pays + l'ajouter au tableau des pays
//                let countryNameJSON = dataJSON["data"][99]["name"]
//                print(countryNameJSON)
             for country in 0...99 
                 let countryNameJSON = dataJSON["data"][country]["name"].stringValue
                 print(countryNameJSON)
                 //on ajoute ce nom au tabeleau de pays
                 //self.countryArray.append(countryNameJSON)
             

         
     
 




【问题讨论】:

创建一个自定义结构,使用Codable 加载数据并使用countryArray[row].name 填充选择器视图。没有循环,没有过时的 SwiftyJSON,没有映射。 【参考方案1】:

创建一个符合Decodable协议的结构并添加所需的属性

struct Country: Decodable 
    var name: String?

在您的类中创建一个名为 countryArrayCountry 对象类型数组 执行 HTTP 调用 从服务器获取数据 使用JSONDecoder解析并加载到countryArray对象中 解析后重新加载countryPickerView

请按照以下示例进行操作

class YourClass 

    @IBOutlet weak var countryPickerView: UIPickerView!

    var countryArray = [Country]()

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        countryPickerView.delegate = self
        countryPickerView.dataSource = self
        httpCall()
    


    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
        return countryArray.count
    

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

    //MARK: - HTTP CALL - GET COUNTRY DATA
    func httpCall() 
        request(covidUrl, method: .get).responseJSON  (response) in
            if response.result.isSuccess 
                let countryArray = try JSONDecoder().decode([Country].self, from: #yourJsonData#)
                countryPickerView.reloadAllComponents()
            
        
    


由于Country 对象符合Decodable 协议,因此解析将在没有循环的情况下完成,因为Struct 与您的JSON 架构匹配。

【讨论】:

以上是关于快速使用 JSON 数据填充选择器视图的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在一个视图上使用不同数据填充多个表的最佳方法是啥? [关闭]

快速将 REST API 中的 JSON 数据填充到表格视图中不起作用

使用可变数组中的值填充选择器视图

在 QT 中实现具有多个小部件的视图的最佳方法是啥?

选择器视图选项填充标签

使用 NSPersistentCloudKitContainer 时预填充核心数据存储的最佳方法是啥?