使用远程 JSON 数组填充 UIPIckerView

Posted

技术标签:

【中文标题】使用远程 JSON 数组填充 UIPIckerView【英文标题】:Populating a UIPIckerView with remote JSON array 【发布时间】:2020-04-29 12:15:17 【问题描述】:

我正在从远程服务器下载 JSON 数组:

var colores = [Colores]()


func downloadJSONColores(completed: @escaping () -> ()) 
         let url = URL(string: "https://../colores.php")


         URLSession.shared.dataTask(with: url!)  (data,response,error) in

            print(data as Any)
            print(response as Any)

         if error == nil 
             do 
                 self.colores = try JSONDecoder().decode([Colores].self, from: data!)

                 DispatchQueue.main.async 
                     completed()
                 

             catch

             

         
         .resume()


     

我有一个 Colores 的结构类:

struct Colores:Decodable 

    let id: Int
    let nombre: String
    let icono: String
    let modelo: Int
    let caracterista: Int


我需要用解码的 JSON 对象填充 PickerView,将字段名称显示为标题并存储来自 pickerview 所选项目的字段 id。

我在viewDidLoad中调用downloadJSONColores方法如下:

downloadJSONColores 
            coloresPV.reloadData()
                     

其中coloresPV 是我的pickerView,但显然这种方式只适用于collectionViews,不适用于pickerViews。 在执行 downloadJSONColores 时填充 pickerView 的最佳方式是什么?

【问题讨论】:

【参考方案1】:

我已经解决了直接在 viewDidLoad 方法中解码 JSON 数组的问题,如下所示:

let url = URL(string: "https://..")!
let dataTask = URLSession.shared.dataTask(with: url)  data, _, error in
    if let error = error  print(error); return 
    do 
        let result = try JSONDecoder().decode([Colores].self, from: data!)
        print(result)
        self.colores = result.map$0.self
        DispatchQueue.main.async 
          self.coloresPV.reloadAllComponents()
        
     catch  print(error) 

dataTask.resume()

【讨论】:

【参考方案2】:

看看UIPickerViewDataSource 和UIPickerViewDelegate 协议。

如果我正确理解您的问题,您需要在 ViewController 中保留一个变量 colors: [Colores]

然后:

UIPickerViewDataSourcefunc numberOfComponents(in: UIPickerView) -> Int函数的实现中返回colors.count

UIPickerViewDelegate的方法pickerView(UIPickerView, titleForRow: Int, forComponent: Int) -> String?函数中返回正确的标题

【讨论】:

以上是关于使用远程 JSON 数组填充 UIPIckerView的主要内容,如果未能解决你的问题,请参考以下文章

JSON 使用 Tableview 填充数组

$.getJSON 执行问题:json 到数组已填充但未使用

swift 这个要点是来自我的一个小应用程序的示例,使用它来填充具有远程JSON的表。

需要帮助使用 SwiftyJSON 使用 JSON 数据填充数组

如何使用 JSON 数组填充 UIPickerView? [关闭]

使用 JSON 数组数据填充 jQuery 函数变量