使用远程 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]
。
然后:
在UIPickerViewDataSource
的func numberOfComponents(in: UIPickerView) -> Int
函数的实现中返回colors.count
,
在UIPickerViewDelegate
的方法pickerView(UIPickerView, titleForRow: Int, forComponent: Int) -> String?
函数中返回正确的标题
【讨论】:
以上是关于使用远程 JSON 数组填充 UIPIckerView的主要内容,如果未能解决你的问题,请参考以下文章
$.getJSON 执行问题:json 到数组已填充但未使用
swift 这个要点是来自我的一个小应用程序的示例,使用它来填充具有远程JSON的表。
需要帮助使用 SwiftyJSON 使用 JSON 数据填充数组